[プログラマー]level 3-ランキング(js)


📌問題と説明


プログラマ-ランキング

📌方法


異なる人のコードを表示することによってヒントが得られ、問題を解決する核心はn-1명과의 경기의 승패를 알 수 있으면 순위를 매길 수 있다である.
例題から分かるように、2番の選手は3명(1번, 3번, 4번)한테 패배で、1명(5번)한테 이겼으므로 n-1位との試合で勝負した.
また問題の条件にはA선수가 B선수보다 실력이 좋다면 A선수는 B선수를 항상 이긴다の条件があり、
Aの実力がBより強ければ、Aに勝った人はBにとって必ず勝つ.
たとえば、
2番の選手に勝った[1,3,4]選手は必ず5番の選手に勝つ
逆に5番の選手は[1,3,4]の選手が絶対負けると考えられる.
このように2次元配列では,各選手の勝敗を表で記入し,表各行(各選手)の勝敗回数がn−1であれば,答えを1ずつ上げる.

📌マイコード

function solution(n, results) {
    var answer = 0;
    var visit = Array.from(Array(n), () => Array(n).fill(0));
    
    // 이겼다면 1을, 졌으면 -1을 채움
    for (var r of results) {
        visit[r[0]-1][r[1]-1] = 1;
        visit[r[1]-1][r[0]-1] = -1;
    }
  


    for (let i =0; i< n; i++) {
        for (let j = 0; j< n; j++) {
            // A가 이긴 사람은 A가 진 사람한테 무조건 진다.
            // 2번이 이긴사람(5번)은 2번이 진사람(1번, 3번, 4번)한테 무조건 진다.
            if (visit[i][j] === 1) {
                let index = [];
                visit[i].map((v,idx) => {
                    if (v === -1) index.push(idx)
                })
                index.map(v => {
                    visit[j][v] = -1;
                })
            } 
            // A를 이긴 사람은 A한테 진사람한테 무조건 이긴다.
            // 2번을 이긴사람(1번, 3번, 4번)은 2번한테 진사람(5번)한타 무조건 이긴다.
            else if (visit[i][j] === -1) {
                let index = [];
                visit[i].map((v,idx) => {
                    if (v === 1) index.push(idx)
                })
                index.map(v => {
                    visit[j][v] = 1;
                })
            }
        }
        
    }
    // 각 행을 돌면서 행의 0의 갯수가 1개면 answer를 1씩 올려준다.(혹은 1 || -1 의 갯수가 n-1이면 answer++)
    visit.map(v => {
        if (v.filter(v => (v === 0)).length === 1) answer++
    });
    return answer;
  
    /*
      테스트케이스 참고 표
      [
        [ 0, 1, 0, 0, 1 ],
        [ -1, 0, -1, -1, 1 ],
        [ 0, 1, 0, -1, 1 ],
        [ 0, 1, 1, 0, 1 ],
        [ -1, -1, -1, -1, 0 ]
      ]
    */
}