[백준 알고리즘] Node.js 2865. 나는 위대한 슈퍼스타K

2023. 8. 29. 16:01코딩연습

1. 문제

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

 

2865번: 나는 위대한 슈퍼스타K

첫째 줄에 N, M, K가 주어진다. (1 ≤ M ≤ 100, 1 ≤ K ≤ N ≤ 100) 다음 M개의 줄은 각 장르에 대한 참가자의 능력이 주어진다. 이 줄에는 N개의 (i, s)쌍이 주어진다. 여기서 i는 참가자의 번호, s는 그

www.acmicpc.net

 

2. 풀이

  • 문제를 이해하는 것부터 애를 먹었던 문제였다.
  • N명이 참가했고, M개의 장르에 대한 오디션을 보았고, K명이 본선에 올라갈 수 있다.
  • 한 사람이 여러 장르를 부를 수는 없지만, 여러 사람이 같은 장르를 부를 수는 있다.
  • 위의 부분이 핵심이였다. 그래서 각각의 N명의 장르에 대한 최대값을 찾고, 내림차순 정렬을 진행하고, K까지만 더해주면 된다!!
const inputs = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');

// 예선 참가자 N명, 장르 M개, 본선 진출 가능 K명
const [N, M, K] = inputs.shift().split(" ").map(v => +v);

// 참가자 번호와 장르 능력치 [번호, 능력치, 번호, 능력치, ...]
const abilities = inputs.map(input => input.split(" ").map(v => +v));

// 참가자들의 장르에 대한 최대값을 담을 배열. 쉽게 담기 위해서 N + 1
let participants = Array(N + 1).fill(0);

for(let i = 0; i < M; i++){
  const ability = abilities[i];
  for(let j = 0; j < ability.length; j+=2){
    let man = ability[j]; // 참가자 번호
    let score = ability[j+1]; // 참가자의 장르 능력치
    
    // 참가자의 장르 능력치의 최대값을 찾아서 담음.
    participants[man] = Math.max(score, participants[man]); 
  }
}

// 0번째는 필요없으니 slice() 이용. 이후 내림차순 정렬.
participants = participants.slice(1).sort((a,b) => b-a);

// 내림차순 정렬 후, 본선 진출 가능자인 K명까지의 점수 합산.
let answer = 0;
for(let i = 0; i < K; i++){
  answer += participants[i];
}

// 소수점 첫째자리까지 반올림해 출력해주어야 하기에 toFixed(1) 이용.
console.log(answer.toFixed(1))

 

3. 정리

  • 처음 문제를 보고는 이해를 못해서 오랜 시간이 걸렸다. 왜 이 문제가 실버4 수준밖에 안되는지 이해가 안되었다. 
  • 그래서 먼저 푸신 분들의 블로그들을 보면서 문제 해석 부분을 통해서 이해할 수 있었다. 이해하고 작성하니 생각보다 많이 쉽다고 느꼈다...........
  • 문제만 잘 이해해도 반은 먹고 들어가는 느낌이다!