[백준 알고리즘] 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 수준밖에 안되는지 이해가 안되었다.
- 그래서 먼저 푸신 분들의 블로그들을 보면서 문제 해석 부분을 통해서 이해할 수 있었다. 이해하고 작성하니 생각보다 많이 쉽다고 느꼈다...........
- 문제만 잘 이해해도 반은 먹고 들어가는 느낌이다!
'코딩연습' 카테고리의 다른 글
[백준 알고리즘] Node.js 12018. Yonsei TOTO (0) | 2023.08.30 |
---|---|
[백준 알고리즘] Node.js 15671. Lemonade Line (0) | 2023.08.30 |
[프로그래머스] 주식 가격 - JavaScript (0) | 2023.08.21 |
[프로그래머스] 더 맵게 - JavaScript (0) | 2023.08.18 |
[백준 알고리즘] Node.js 1531. 투명 (0) | 2023.08.10 |