[JS] 전력망 둘로 나누기 -bfs

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

    [프로그래머스

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

    programmers.co.kr](https://school.programmers.co.kr/learn/courses/30/lessons/86971)

    접근 방법

    1. 트리를 만든다.
    2. 노드 하나씩 방문한다.
    • 2-1. 끊어질 노드를 방문 표시를 한다.
    • 2-2. bfs로 방문할 노드들의 개수를 구한다.
      1. 차이는 (총 노드의 개수 - 방문한 노드 개수) - 방문한 노드 개수의 절대값이다.
      • n=9, 첫번째 노드가 연결된 개수 = 8일 경우 두 전력망이 가진 노드의 개수 차이는 7이다.
      1. 차이를 계산한 배열 중 가장 최솟값을 반환한다.
    function solution(n, wires) {  
    const result = \[\];  
    //트리 만들기  
    const tree = Array.from(Array(n + 1), () => \[\]);
    
    wires.map((element) => {  
    let \[a, b\] = element;  
    tree\[a\].push(b);  
    tree\[b\].push(a);  
    });
    
    // 기준이 되는 노드 eles  
    tree.forEach((eles, i) => {  
    eles.forEach((v) => {  
    const visited = Array.from(Array(n + 1), () => false);  
    // 끊어졌다고 생각해야 되는 노드 v를 방문했다고 처리하고 기준이 되는 노드와 연결된 노드 개수를 찾는다.  
    visited\[v\] = true;  
    result.push(getBfsCount(i, visited, tree));  
    });  
    });  
    const DiffArr = result.map((v) => Math.abs((n - v) - v));
    
    return Math.min(...DiffArr);  
    }
    
    // 노드와 연결된 노드 개수를 반환함  
    function getBfsCount(start, visited, tree) {  
    const q = \[start\];  
    let cnt = 0;  
    while (q.length !== 0) {  
    const current = q.shift();  
    visited\[current\] = true;  
    tree\[current\].forEach((v) => {  
    if (!visited\[v\]) {  
    q.push(v);  
    }  
    });  
    cnt++;  
    }  
    return cnt;  
    }

    댓글