치춘짱베리굿나이스

[백준] 1205 본문

등수 구하기

문제

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

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

예를 들어 랭킹 리스트가 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보다 큰 경우에만 주어진다.

출력

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

풀이

const djmax = () => {
  const [[n, taesu, p], arr] = require("fs")
    .readFileSync("/dev/stdin")
    .toString()
    .trim()
    .split("\n")
    .map((v) => v.split(" ").map(Number));
  if (n === 0) {
    console.log(1);
    return;
  }
  arr.push(taesu);
  const arrSorted = arr.sort((a, b) => b - a);
  let indexes = [];
  let index = arrSorted.indexOf(taesu);
  while (index !== -1) {
    indexes.push(index + 1);
    index = arrSorted.indexOf(taesu, index + 1);
  }
  if (indexes[indexes.length - 1] > p) console.log(-1);
  else console.log(indexes[0]);
};

djmax();

반성회

  1. 태수의 점수를 리스트에 섞어넣는다
  2. 리스트를 내림차순으로 정렬한다 (맨 앞에 있는 점수가 가장 높은 등수여야 하므로)
  3. 태수의 점수와 같은 값들의 인덱스를 모두 구해서 (arrSorted.indexOf(taesu) 반복) indexes 배열에 넣는다, 단 배열의 인덱스는 등수보다 1 작으므로 1씩 더해서 넣는다
  4. 만약 indexes 배열의 맨 끝 값이 p보다 크다면, 태수의 점수가 랭킹 리스트 밖에 위치하므로 -1을 출력한다
  5. 그 외의 경우, indexes 배열의 맨 처음 값을 출력한다

굳이 이런 방법을 선택한 이유는 태수의 점수가 랭킹 바깥에 위치할 경우에는 같은 값끼리 등수가 갱신되지 않고, 그보다 더 큰 점수를 얻어야 등수가 갱신되기 때문

처음에는 반복문으로 등수를 구할까 하다가 이게 제일 나은 것 같다

'Javascript + Typescript > 자바스크립트로 알고리즘풀기' 카테고리의 다른 글

[백준] 2754  (0) 2022.07.13
[백준] 6064  (0) 2022.07.12
[백준] 11478  (0) 2022.07.09
[백준] 1237  (0) 2022.07.09
[백준] 1920  (0) 2022.07.09
Comments