FrontEnd/프로그래머스

[JS] 순위

728x90

DFS + 그리디 알고리즘을 활용해서 해결해보았다.

 

우선 그래프 두개를 두고

 

a > b라면

winGraph와 loseGraph를 두고 이긴쪽,진쪽만 저장했다.

 

이후 n번째 노드가 들어왔다면 해당 노드를 이긴사람들을 차례로 탐색했다. 또 진쪽으로도 마찬가지로 한방향만을 탐색했다.

 

이렇게 한 이유는 순위를 정확히 매기려면 a>b>c ... 이렇게 한 방향이 고정적으로 되어있어야 하기 때문이다.

 

 

 

 

++ DP를 사용해서 저장한다면 조금 더 효율적인 코드를 짜는것도 가능할 듯 하다.

 

 

function solution(n, results) {
    const winGraph = [...new Array(n+1)].map(_ => [])
    const loseGraph = [...new Array(n+1)].map(_ => [])
    
    for (const [a,b] of results){
        winGraph[a].push(b)
        loseGraph[b].push(a)
    }
    
    const getLinkedGraphSize = (node,graph,visited) => {
        if(visited[node]) return 0
        visited[node] = true
        let ret = 1
        for (const nxNode of graph[node])
            ret += getLinkedGraphSize(nxNode,graph,visited)
        return ret
    }
    
    let ret = 0
    for (let i = 1 ; i <= n ; i++){
        let cnt = 0
        let visited = Array(n+1).fill(false)
        cnt += getLinkedGraphSize(i,winGraph,visited)
        visited = Array(n+1).fill(false)
        cnt += getLinkedGraphSize(i,loseGraph,visited)
        if (cnt===n+1) ret ++
    }
    return ret
}
728x90

'FrontEnd > 프로그래머스' 카테고리의 다른 글

[JS] 입국심사  (1) 2023.12.28
[JS] 가장 먼 노드  (0) 2023.12.27
[JS] 자물쇠와 열쇠  (0) 2023.12.24
[JS] 외벽 점검  (1) 2023.12.21
[JS] 블록 이동하기  (0) 2023.12.20