본문 바로가기

코딩테스트

[프로그래머스] level3. 순위 (javascript)

반응형

문제

 

코딩테스트 연습 - 순위

5 [[4, 3], [4, 2], [3, 2], [1, 2], [2, 5]] 2

programmers.co.kr

나의 풀이

모르겠다.

참조

 

[프로그래머스/그래프, 플로이드] lv3. 순위 (JavaScript)

정확하게 순위를 매길 수 있는 선수의 의미는 다른 모든 노드와 그래프로 연결되어 있는 경우를 의미한다. 플로이드 와샬을 활용한 풀이가 가장 출제의도에 맞는 풀이인 것 같다.

velog.io

위 블로그와 동일한 코드입니다.

위 블로그를 보면서 따라 만들어 보고, 왜 이런지 고민해보았다.

function solution(n, results) {
    var answer = 0;

      //배열 선언
    let arr = Array.from({length:n} , (_,i)=>Array.from({length:n},(_,j)=> i===j ? 0 : false))

    //손실되지 않은 정보 적용, 이기면 1, 지면 -1
    results.forEach(([start,end])=>{
        arr[start-1][end-1] =1
        arr[end-1][start-1] =-1
    })


    for(let m = 0 ; m < n;m++){
        for(let i = 0 ; i < n;i++){
            for(let j = 0 ; j < n;j++){
                  // i가 m을 이기고, m이 j를 이기면 i가 j를 이긴 것으로 간주 할 수 있다.
                if(arr[i][m] === 1 && arr[m][j] === 1){
                    arr[i][j] =1
                }
                if(arr[i][m] === -1 && arr[m][j] === -1){
                    arr[i][j] = -1
                }
            }
        }
    }

    for(let i = 0 ; i < n;i++){
        let hasFalse = false;
        for(let j = 0 ; j < n;j++){
            if(arr[i][j] === false){
                hasFalse = true;
                break;
            }
        }
          // 모든 알 수 있는 정보는 arr에 들어 있으므로
          // false가 배열에 없으면 몇등인지 유추할 수 있는 부분 인 것이다.
        answer = !hasFalse ? answer+1 : answer
    }

    return answer;
}

결국 노드(그래프)는 for문 3개를 돌리는 것을 통해 답을 구하는 것 같다.
저 3번째 for문 안에 내가 원하는 조건을 적고, arr에 적용 되도록 하는 것이 포인트 같다.

 

for문을 3번 돌리면서 연결 될 수 있는 부분은 다 채워진 것이다.

 

마지막으로 이를 통해 배열을 원하는 정보로 채운 후 다시 전체 배열을 대상으로 마지막 조건으로 최종 답을 도출하면 되는 것 같다.

반응형