[완전 탐색] 전력망을 둘로 나누기

LMH·2023년 2월 26일
0

프로그래머스(LV2) 전력망을 둘로 나누기

프로그래머스의 코딩테스트 문제를 정리해서 포스팅하겠습니다.

전력망을 둘로 나누기

문제 설명

n개의 송전탑이 전선을 통해 하나의 트리 형태로 연결되어 있습니다. 당신은 이 전선들 중 하나를 끊어서 현재의 전력망 네트워크를 2개로 분할하려고 합니다. 이때, 두 전력망이 갖게 되는 송전탑의 개수를 최대한 비슷하게 맞추고자 합니다.

송전탑의 개수 n, 그리고 전선 정보 wires가 매개변수로 주어집니다. 전선들 중 하나를 끊어서 송전탑 개수가 가능한 비슷하도록 두 전력망으로 나누었을 때, 두 전력망이 가지고 있는 송전탑 개수의 차이(절대값)를 return 하도록 solution 함수를 완성해주세요.

제한사항

n은 2 이상 100 이하인 자연수입니다.
wires는 길이가 n-1인 정수형 2차원 배열입니다.
wires의 각 원소는 [v1, v2] 2개의 자연수로 이루어져 있으며, 이는 전력망의 v1번 송전탑과 v2번 송전탑이 전선으로 연결되어 있다는 것을 의미합니다.
1 ≤ v1 < v2 ≤ n 입니다.
전력망 네트워크가 하나의 트리 형태가 아닌 경우는 입력으로 주어지지 않습니다.

입출력 예

nwiresresult
9[[1,3],[2,3],[3,4],[4,5],[4,6],[4,7],[7,8],[7,9]]3
4[[1,2],[2,3],[3,4]]0
7[[1,2],[2,7],[3,7],[3,4],[4,5],[6,7]]1

입출력 예 설명

다음 그림은 주어진 입력을 해결하는 방법 중 하나를 나타낸 것입니다.


4번과 7번을 연결하는 전선을 끊으면 두 전력망은 각 6개와 3개의 송전탑을 가지며, 이보다 더 비슷한 개수로 전력망을 나눌 수 없습니다.
또 다른 방법으로는 3번과 4번을 연결하는 전선을 끊어도 최선의 정답을 도출할 수 있습니다.

접근 방법

우선 타워이 연결되어 있는 타워들의 리스트를 알 수 있도록 구조화합니다. BFS로 전선을 잘랐을 때 양쪽의 타워 개수를 구한 후 그 차이를 결과값에 담습니다. 그리고 결과값들 중에서 최소값을 찾아 리턴 합니다.

function solution(n, wires) {
    // 각 타워간 연결되어 있는 타워들을 구조화한다.
    const towers = {};
    const result = [];
    for(let wire of wires) {
        const [tower1, tower2] = wire;
        if(!towers[tower1]) towers[tower1] = [];
        if(!towers[tower2]) towers[tower2] = [];
        towers[tower1].push(tower2)
        towers[tower2].push(tower1)
    }
    
    // 타워를 탐색하는 함수 구현
    function searchTower(tower, cutTower) {
        const visited = Array.from({length : n+1}, () => false);
        const stack = [];
        let count = 1;
        stack.push(tower)
        
        visited[tower] = true;
        while(stack.length) {
            const current = stack.pop();
            towers[current].forEach(next => {
                if(next !== cutTower && !visited[next]) {
                    visited[next] = true;
                    stack.push(next);
                }
            })
           count++;
       }
        return count;
    }
// 전선들을 순회하면서 타워개수 차이 구하기
  wires.forEach((wire) => {
    const [a, b] = wire;
    const gap = Math.abs(searchTower(a, b) - searchTower(b, a));
    
    result.push(gap)
  });
    
  return Math.min(...result);
}
profile
새로운 것을 기록하고 복습하는 공간입니다.

0개의 댓글