국영수

문제

언어

  • JavaScript

순서도

  1. 국어 점수가 감소하는 순서로
  2. 국어 점수가 같으면 영어 점수가 증가하는 순서로
  3. 국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로
  4. 모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로
  5. 정렬

문제 풀이 step 1

  • 주어진 학생의 성적 목록을
  • 국어 점수는 내림 차순으로
  • 영어 점수는 오름 차순으로
  • 수학 점수는 내림 차순으로
  • 이름은 사전순으로 증가하는 순으로
  • 정렬하면 됩니다.
  • Array 에서 제공하는 sort 함수를 사용해서 각 과목과 이름에 대해서 조건 분기를 해주면 되는 문제입니다.
  • 정렬 후 이름만 뽑아서 출력하면 정답입니다.
  • 추가 설명은 주석으로 작성하겠습니다.

후기

  • Java 에서는 sort 함수 안에서 boolean 값을 반환해도 정렬이 되었습니다.
  • 하지만 JavaScript 에서는 sort 함수 안에서 Number 값을 반환해야 정렬이 되는 것을 처음 알았습니다.
  • 그래서 문자열을 정렬할 때는 비교 연산자 (<, >) 를 이용해서, 조건에 따라 -1 (음수), 1 (양수) 을 반환하도록 구현해야 합니다.
  • 추가 학습이 필요한 부분: 문자열 비교

소스 코드

const input = require("fs")
	.readFileSync("/dev/stdin")
	.toString()
	.trim()
	.split("\n");

const solution = (input) => {
	const n = Number(input[0]);
	const arr = input
		.slice(1)
		.map((v) => v.split(" "))
		.map((v) => [v[0], Number(v[1]), Number(v[2]), Number(v[3])]);

	arr.sort((a, b) => {
		const [aNam, aLan, aEng, aMat] = a;
		const [bNam, bLan, bEng, bMat] = b;

		// 국어 점수는 감소하는 순서로
		if (aLan !== bLan) return bLan - aLan;

		// 영어 점수는 증가하는 순서로
		if (aEng !== bEng) return aEng - bEng;

		// 수학 점수는 감소하는 순서로
		if (aMat !== bMat) return bMat - aMat;

		// 이름이 사전 순으로 증가하는 순서로
		if (aNam > bNam) return 1;
		else return -1;
	});

	return arr.map((v) => v[0]).join("\n");
};

console.log(solution(input));