[프로그래머스]level3- 순위(js)

swanious·2021년 7월 17일
0

📌문제와 설명

프로그래머스 - 순위

📌접근 방식

다양한 사람들의 코드를 보면서 힌트를 얻었는데, 문제를 풀기위한 핵심은 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이면 answer을 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 ]
      ]
    */
}
profile
TIL 기록을 위한 블로그

0개의 댓글