BOJ[10825] - 국영수 by JavaScript
국영수
문제
언어
- JavaScript
순서도
- 국어 점수가 감소하는 순서로
- 국어 점수가 같으면 영어 점수가 증가하는 순서로
- 국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로
- 모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로
- 정렬
문제 풀이 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));