n개의 송전탑이 전선을 통해 하나의 트리 형태로 연결되어 있습니다. 당신은 이 전선들 중 하나를 끊어서 현재의 전력망 네트워크를 2개로 분할하려고 합니다. 이때, 두 전력망이 갖게 되는 송전탑의 개수를 최대한 비슷하게 맞추고자 합니다.
송전탑의 개수 n, 그리고 전선 정보 wires가 매개변수로 주어집니다. 전선들 중 하나를 끊어서 송전탑 개수가 가능한 비슷하도록 두 전력망으로 나누었을 때, 두 전력망이 가지고 있는 송전탑 개수의 차이(절대값)를 return 하도록 solution 함수를 완성해주세요.
n-1 인 정수형 2차원 배열입니다.| n | wires | result |
|---|---|---|
| 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 |
입출력 예 #1
다음 그림은 주어진 입력을 해결하는 방법 중 하나를 나타낸 것입니다.

입출력 예 #2
다음 그림은 주어진 입력을 해결하는 방법을 나타낸 것입니다.

입출력 예 #3
다음 그림은 주어진 입력을 해결하는 방법을 나타낸 것입니다.

트리를 만들고, 간선을 하나씩 끊어가면서 두 개의 송전탑 아래로 총 몇개가 있는지 확인해 보았다.
function solution(n, wires) {
var answer = 100; // 최대값은 100을 넘을 수 없다.
// 간단한 트리
const tree = new Array(n+1).fill(0).map(_ => []);
wires.forEach(elem => {
const [a,b] = elem;
tree[a].push(b);
tree[b].push(a);
})
// 특정 송전탑에서 연결된 모든 송전탑 개수를 세는 BFS (단, 특정 노드가 끊어졌을 경우를 고려)
function BFS(start, disconnect) {
let count = 0;
const visited = [];
const queue = [start];
while (queue.length) {
let node = queue.shift();
tree[node].forEach((elem) => {
if (elem !== disconnect && !visited.includes(elem)) {
visited.push(elem)
queue.push(elem);
}
})
count++;
}
return count;
}
wires.forEach(elem => {
const [a,b] = elem;
const diff = Math.abs(BFS(a,b)-BFS(b,a));
if (diff < answer) answer = diff;
})
return answer;
}
나와 같이 1번만 통과하지 못하는 사람들이 많은 듯 보였다.
반례를 구했다.
n=4, [[1, 2], [1, 3], [1, 4]], return = 2따라서 이점을 개선했다.
우선 기본적으로 BFS의 카운트를 1로 수정하고, visited에 시작지점을 넣어서 수정했다.
function solution(n, wires) {
var answer = 100;
// 간단한 트리
const tree = new Array(n+1).fill(0).map(_ => []);
wires.forEach(elem => {
const [a,b] = elem;
tree[a].push(b);
tree[b].push(a);
})
// 특정 송전탑에서 연결된 모든 송전탑 개수를 세는 BFS (단, 특정 노드가 끊어졌을 경우를 고려)
function BFS(start, disconnect) {
let count = 1;
const visited = [start];
const queue = [start];
while (queue.length) {
let node = queue.shift();
tree[node].forEach((elem) => {
if (elem !== disconnect && !visited.includes(elem)) {
visited.push(elem)
queue.push(elem);
}
})
count++;
}
return count;
}
wires.forEach(elem => {
const [a,b] = elem;
const diff = Math.abs(BFS(a,b)-BFS(b,a));
if (diff < answer) answer = diff;
})
return answer;
}