문제
https://www.acmicpc.net/problem/5766

풀이과정
의사코드
1. 입력을 전부 받아 배열 input에 저장한다.
2. i = 0부터 시작하여, 테스트케이스별로 반복 처리한다.
3. 각 테스트케이스에서:
N과 M을 선언한다.
i+1 ~ i+N까지의 줄을 투표 결과(weekRanks)로 저장한다.
i += N으로 다음 테스트케이스를 준비한다.
4. 선수별 득표수를 저장할 Map을 생성한다. 각 줄에서 등장하는 선수 번호를 순회하며:
Map에 없다면 1로 초기화 있다면 기존 값에 +1
5. Map을 배열로 변환하고, 득표 수 기준으로 내림차순 정렬한다.
6. 두 번째 득표 수를 secondScore로 저장한다.
(이 때, 최고점은 1명만 존재하므로 무조건 두번째에 값이 위치한다.)
7. 득표 수가 secondScore인 선수 번호만 골라서 오름차순 정렬한다.
8. 정답을 공백으로 이어 출력한다.
9. input[i]가 '0 0'이 될 때까지 위 과정을 반복한다.
전체코드
const readline = require('readline');
(async () => {
const rl = readline.createInterface({ input: process.stdin });
const input = [];
for await (const line of rl) {
input.push(line.trim());
if (line.trim() === '0 0') rl.close();
}
let i = 0
while (i < input.length - 1) {
let [N, M] = input[i++].split(' ').map(Number);
let weekRanks = input.slice(i, i + N);
i += N;
const voteMap = new Map();
for (let ranks of weekRanks) {
const players = ranks.split(' ').map(Number);
for (let player of players) {
voteMap.set(player, (voteMap.get(player) || 0) + 1);
}
}
const sortedMap = [...voteMap.entries()].sort((a, b) => b[1] - a[1]);
const secondScore = sortedMap[1][1];
const secondPlace = sortedMap
.filter(([_, score]) => score === secondScore)
.map(([player]) => player)
.sort((a, b) => a - b);
console.log(secondPlace.join(' '));
}
})();'Algorithm' 카테고리의 다른 글
| [BOJ] 2346번: 풍선 터뜨리기 자바스크립트 풀이 (메모리 초과) (0) | 2025.07.08 |
|---|---|
| [BOJ] 22858번: 원상 복구 (small) 자바스크립트 풀이 (0) | 2025.06.22 |
| [BOJ] 10994번: 별 찍기 - 19 자바스크립트 풀이 (0) | 2025.06.20 |