[프로그래머스] 코딩테스트 연습 - 78

krkorklo·2022년 2월 25일
0

프로그래머스

목록 보기
78/78

level 3 - 네트워크

네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있을 때 컴퓨터 A와 컴퓨터 C도 간접적으로 연결되어 정보를 교환할 수 있습니다. 따라서 컴퓨터 A, B, C는 모두 같은 네트워크 상에 있다고 할 수 있습니다.
컴퓨터의 개수 n, 연결에 대한 정보가 담긴 2차원 배열 computers가 매개변수로 주어질 때, 네트워크의 개수를 return 하도록 solution 함수를 작성하시오.

입출력 예시
n : 3
computers : [[1, 1, 0], [1, 1, 0], [0, 0, 1]]
-> 2

function solution(n, computers) {
    var parent = [...Array(n).keys()];
    
    for(var i=0; i<computers.length; i++) {
        for(var j=0; j<computers[i].length; j++) {
            if (i == j || computers[i][j] == 0) continue;
            union(i, j);
        }
    }
    
    function find(num) {
        if (parent[num] == num) return num;
        parent[num] = find(parent[num]);
        return parent[num];
    }
    function union(a, b) {
        a = find(a);
        b = find(b);
        
        if (a < b) parent[b] = a;
        else parent[a] = b;
        
        for(var i=0; i<parent.length; i++) parent[i] = find(parent[i])
    }
    
    return new Set(parent).size;
}

방금 전에 union 사용했다고 또 사용함ㅎㅎㅎ
근데 자꾸 틀려서 뭐지 했는데 마지막에 for문으로 다시 parent 설정을 해줘야했음

그리고 원래 dfs 카테고리에 있어서 그런지 dfs로 많이 푸셨드라

function solution(n, computers) {
    var answer = 0;
    var visited = new Array(n).fill(false);

    function dfs(computers, i) {
        visited[i] = true;
        for(var j = 0; j < computers.length; j++) {
            if(!visited[j] && computers[i][j] === 1) {
                dfs(computers, j);
            }
        }
    }

    for(var i = 0; i < n; i++) {
        if(!visited[i]) {
            answer++;
            dfs(computers, i);
        }
    }

    return answer;
}

그래서 보니까 dfs가 훨씬 쉽더라
껄껄껄껄걸껄

0개의 댓글