프로그래머스 순위 JavaScript
2023년 2월 12일
문제 풀이
순위를 매길 수 있는 선수의 수를 리턴하는 문제
이 문제의 핵심 풀이는 게임(승리 + 패배) 수가 n-1이어야 순위를 매길 수 있다는 것이다.
이때 i 번째 사람이 승리한 사람들의 승리와 패배한 사람들의 패배도 포함해야 한다.
예) n = 5, results = [[4, 3], [4, 2], [3, 2], [1, 2], [2, 5]]:
results만 입력했을 때:
index.md
1: {win: [2], loss: []}
2: {win: [5], loss: [1, 3, 4]}
3: {win: [2], loss: [4]}
4: {win: [2, 3], loss: []}
5: {win: [], loss: [2]}
승리한 사람의 승리와 패배한 사람의 패배도 포함했을 때:
index.md
1: {win: [2, 5], loss: []}
2: {win: [5], loss: [1, 3, 4]}
3: {win: [2, 5], loss: [4]}
4: {win: [2, 3, 5], loss: []}
5: {win: [], loss: [1, 2, 3, 4]}
=> 2, 5의 순위를 매길 수 있다.
code
gameRecord[i] = {"win":new Set(), "loss":new Set()}
: 중복을 피하기 위해 Set()
을 이용하고, 승리와 패배를 나눠서 저장한다.
solution.js
function solution(n, results) {
let answer = 0;
const gameRecord = {};
for (let i = 1; i <= n; i++) {
gameRecord[i] = {"win":new Set(), "loss":new Set()};
}
results.forEach(record => {
const [win, loss] = record;
gameRecord[win].win.add(loss);
gameRecord[loss].loss.add(win);
});
for (let i = 1; i <= n; i++) {
const iWins = gameRecord[i].win;
iWins.forEach((element) => {
gameRecord[element].win.forEach((item) => {
gameRecord[i].win.add(item);
});
});
const iLosses = gameRecord[i].loss;
iLosses.forEach((element) => {
gameRecord[element].loss.forEach((item) => {
gameRecord[i].loss.add(item);
});
});
const gameNum = gameRecord[i].win.size + gameRecord[i].loss.size;
if (gameNum === n-1) {
answer++;
}
}
return answer;
}