프로그래머스 순위 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;
}

댓글