[백준] 1205 등수 구하기 JavaScript

·2024년 11월 19일

문제

태수가 즐겨하는 디제이맥스 게임은 각각의 노래마다 랭킹 리스트가 있다. 이것은 매번 게임할 때 마다 얻는 점수가 비오름차순으로 저장되어 있는 것이다.

이 랭킹 리스트의 등수는 보통 위에서부터 몇 번째 있는 점수인지로 결정한다. 하지만, 같은 점수가 있을 때는 그러한 점수의 등수 중에 가장 작은 등수가 된다.

예를 들어 랭킹 리스트가 100, 90, 90, 80일 때 각각의 등수는 1, 2, 2, 4등이 된다

랭킹 리스트에 올라 갈 수 있는 점수의 개수 P가 주어진다. 그리고 리스트에 있는 점수 N개가 비오름차순으로 주어지고, 태수의 새로운 점수가 주어진다. 이때, 태수의 새로운 점수가 랭킹 리스트에서 몇 등 하는지 구하는 프로그램을 작성하시오. 만약 점수가 랭킹 리스트에 올라갈 수 없을 정도로 낮다면 -1을 출력한다.

만약, 랭킹 리스트가 꽉 차있을 때, 새 점수가 이전 점수보다 더 좋을 때만 점수가 바뀐다.

입력

첫째 줄에 N, 태수의 새로운 점수, 그리고 P가 주어진다. P는 10보다 크거나 같고, 50보다 작거나 같은 정수, N은 0보다 크거나 같고, P보다 작거나 같은 정수이다. 그리고 모든 점수는 2,000,000,000보다 작거나 같은 자연수 또는 0이다. 둘째 줄에는 현재 랭킹 리스트에 있는 점수가 비오름차순으로 주어진다. 둘째 줄은 N이 0보다 큰 경우에만 주어진다.

출력

첫째 줄에 문제의 정답을 출력한다.

예제 입력

3 90 10
100 90 80

예제 출력

2

내가 했던 풀이 방법

  1. N이 0일 경우 항상 1등이 되므로 1을 출력해주고 끝낸다.
  2. N이 0이 아닐 경우, ranking에 newScore를 넣어주고 재정렬해준다.
  3. 정렬된 ranking을 P개만큼 slice 해준 다음 list에 저장한다. list에 담긴 score만이 랭킹 리스트에 기록된다. 랭킹 리스트에 기록되지 않은 나머지 ranking을 rest에 저장해준다.
  4. list의 마지막 점수보다 newScore가 작을 경우 랭킹 리스트에 기록될 수 없으므로 -1을 return 한다.
  5. 만약, newScore의 점수가 list의 마지막 값과 같다면 해당 점수가 내 점수인지를 체크해야 한다. 만약, 랭킹 리스트가 꽉 차있을 때, 새 점수가 이전 점수보다 더 좋을 때만 점수가 바뀐다.라는 조건이 있기 때문에 나와 같은 점수가 이미 있었다면, 내 점수가 아닐 수도 있기 때문이다. 여기서 rest의 첫 번째 값을 이용할 수 있다. 내 점수가 포함되어 있지 않다면, rest의 첫 번째 값이 newScore보다 작아야 하기 때문이다. 그러므로 rest의 첫 번째 값이 newScore와 같다면 무조건 내 점수가 등록되지 않았다는 것이다.
  6. 4/5번 경우가 아니라면, 순차적으로 순위를 증가시키면서 newScore와 같은 값이 나오면 바로 순위를 출력하면 된다. 내 순위가 아니더라도 같은 점수끼리는 같은 등수이기 때문에 문제가 없다.

코드

const fs = require('fs');
let [n, rankig] = fs.readFileSync(0, 'utf-8').toString().trim().split('\n');

let [N, newScore, P] = n.trim().split(' ').map(Number);
if (N === 0) {
  console.log(1);
} else {
  rankig = rankig.trim().split(' ').map(Number);

  rankig.push(newScore);
  rankig.sort((a, b) => b - a);

  let list = rankig.slice(0, P);
  let rest = rankig.slice(P);
  if (list[list.length - 1] > newScore) console.log(-1);
  else if (rest[0] === newScore) console.log(-1);
  else {
    let rank = 1;
    for (let i = 0; i < P; i++) {
      if (list[i] === newScore) {
        console.log(rank);
        break;
      } else {
        rank++;
      }
    }
  }
}

회고

실버4인만큼 어려운 문제는 아니고 예시 출력으로 처리해야 하는 예외를 다 알려줘서 문제는 없었는데, 예외가 없었다면 몇 번 틀렸을 것 같은 생각.. N이 0이 들어오는 건 전혀 생각도 못했다. 이래서 값 범위를 잘 체크해야 하나보다

profile
Frontend🍓

0개의 댓글