코테

프로그래머스) 네트워크(js)

devgenie 2024. 7. 2. 16:10

https://school.programmers.co.kr/learn/courses/30/lessons/43162

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


그래프가 주어졌을 때 간선으로 연결된 노드 묶음을 세는 문제이다.
섬이 되는 노드 묶음의 갯수를 파악하면 된다.
내가 짠 정답코드는 다음과 같다.

function solution(n, computers) {
    var answer = 0;
    let ch = Array.from({length : n}, ()=>0); // (1)
    
    const DFS = (v, ch) => {
        ch[v] = 1; // (3)
        for(let i = 0; i < n; i++){
            if(ch[i] === 0 && computers[v][i] === 1){ // (4)
                DFS(i, ch);
            }
        }
    }
    
    for(let i = 0; i < ch.length; i++){
        if(ch[i] === 1) continue; // (2)
        answer++;
        DFS(i, ch);
    }
    
    return answer;
}


깊이우선탐색(DFS) 을 이용하여 해결하였다.
코드의 주요 역할은 다음과 같다.

(1) 이미 방문한 노드를 체크하기 위한 ‘ch’ 배열을 생성하였다. 인덱스가 노드의 번호이고 0인 경우 미방문, 1인 경우 방문한 노드를 나타낸다.
(2) ‘ch[i]’  === 1 인 경우는 이미 방문한 노드이므로 현재 루프에서 countinu 한다.
(3) 현재 노드 i를 방문하였기 때문에 ch[i] = 1 을 할당한다.
(4) 해당 노드에서 깊이우선탐색을 하기 전에 ch[i]의 값을 통하여 이미 방문한 노드인지 아닌지 확인하고, 현재 노드에서 방문할 수 있는 노드인지 확인한다.

넓이우선탐색(BFS)나 UnionFind를 이용하여 푼 답안들도 있는 것 같은데, 기회가 되면 이러한 알고리즘을 이용하여 다시 풀어봐야겠다.