728x90

문제


https://www.acmicpc.net/problem/10825

 

10825번: 국영수

첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 1

www.acmicpc.net

 

코드


//실버4 국영수
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\r\n");

let answer = []; //정답이 될 이름들을 담을 배열
let N = parseInt(input.shift()); //학생 수

input = input
  .map((i) => i.split(" ").map((j) => Number(j) || j)) //input의 각 요소에 대해 공백기준으로 나누어서 배열화하고, number형으로 변환가능한 건 변환하고 아니면 string 그대로 변환
  .sort((a, b) => {
    if (a[1] < b[1]) return 1;
    //국어점수 비교(내림차순)
    else if (a[1] > b[1]) return -1;
    else {
      if (a[2] > b[2]) return 1;
      //영어점수 비교(오름차순)
      else if (a[2] < b[2]) return -1;
      else {
        if (a[3] < b[3]) return 1;
        //수학점수 비교(내림차순)
        else if (a[3] > b[3]) return -1;
        else {
          if (a[0] > b[0]) return 1;
          //이름 비교(오름차순)
          else if (a[0] < b[0]) return -1;
          else return 0;
        }
      }
    }
  });
input.forEach((i) => answer.push(i[0])); //조건대로 정렬된 input의 이름만 push
console.log(answer.join("\n")); //한줄단위로 이름 출력

 

후기


  • 정렬문제 자체는 어렵지 않았으나 맨 처음 input의 '학생이름 국어점수 영어점수 수학점수'를 학생이름만 string으로 받고, 나머지는 number 형으로 받는 방법에서 막혔는데, 다른 분의 풀이를 참고하여 해결하였다
  • map을 이중으로 쓰며 "|| 연산자"의 특성을 활용하여 Number형으로 변환 가능한 것은 number로 바꿔주고 아닌것은 원래 string그대로 받을 수 있는 방법이 신박했다

+ Recent posts