문제링크
https://programmers.co.kr/learn/courses/30/lessons/86971
n개의 송전탑이 전선을 통해 하나의 트리 형태로 연결되어 있습니다. 당신은 이 전선들 중 하나를 끊어서 현재의 전력망 네트워크를 2개로 분할하려고 합니다. 이때, 두 전력망이 갖게 되는 송전탑의 개수를 최대한 비슷하게 맞추고자 합니다.
송전탑의 개수 n, 그리고 전선 정보 wires가 매개변수로 주어집니다. 전선들 중 하나를 끊어서 송전탑 개수가 가능한 비슷하도록 두 전력망으로 나누었을 때, 두 전력망이 가지고 있는 송전탑 개수의 차이(절대값)를 return 하도록 solution 함수를 완성해주세요.
- n은 2 이상 100 이하인 자연수입니다.
- wires는 길이가 n-1인 정수형 2차원 배열입니다.
- wires의 각 원소는 [v1, v2] 2개의 자연수로 이루어져 있으며, 이는 전력망의 v1번 송전탑과 v2번 송전탑이 전선으로 연결되어 있다는 것을 의미합니다.
- 1 ≤ v1 < v2 ≤ n 입니다.
- 전력망 네트워크가 하나의 트리 형태가 아닌 경우는 입력으로 주어지지 않습니다.
가장 많이 연결되어 있는 연결망을 끊으면 송전탑의 개수가 최소가 될 거 같아서 그 기준으로 로직을 짰는데 코드를 실행했을 때는 통과됐지만 제출하니 오류가 났다.
function solution(n, wires) {
var answer = -1;
let arr = [];
wires = wires.map(v => v.sort((a,b) => a-b));
wires.sort((a,b) => a[0] - b[0]);
for(let i=1; i<=n; i++){
let sum = 0;
for(let j=0; j<wires.length; j++) if(wires[j][1] == i || wires[j][0] == i) sum++;
arr.push(sum);
}
let sortArr = [...arr].sort((a,b) => b-a);
let idx = -1;
let tmp = 0;
while(idx == -1){
let locked = [arr.indexOf(sortArr[0])+1, arr.lastIndexOf(sortArr[1])+1].sort((a,b) => a-b);
for(let i=0; i<wires.length; i++) {
if(wires[i][0] == locked[0] && wires[i][1] == locked[1]){
idx = i;
break;
}
};
if(idx == -1) arr[arr.lastIndexOf(sortArr[1])] = 0;
};
return Math.abs(wires.slice(0,idx).length - wires.slice(idx+1).length);
}
function solution(n, wires) {
const links = {};
wires.map(w => {
const [a,b] = w;
if(!links[a]) links[a] = [];
if(!links[b]) links[b] = [];
links[a].push(b);
links[b].push(a);
})
const searchTree = (root, exception) => {
let count = 0;
const queue = [root];
const visited = [];
visited[root] = true;
while(queue.length){
const cur = queue.pop();
links[cur].map(next => {
if(next != exception && !visited[next]){
visited[next] = true;
queue.push(next);
}
})
count++;
}
return count;
}
let answer = 100;
wires.map((w,i) => {
const[a,b] = w;
const dif = Math.abs(searchTree(a,b) - searchTree(b,a));
answer = answer > dif ? dif : answer;
})
return answer;
}
연결 선에 대한 map을 만들어서 wires에서 map에 연결된 선의 갯수를 반환하고 그 개수 차의 절댓값을 answer가 비교하여 가장 작은 값을 반환한다.