function solution(n, wires) {
const network = Array.from({length:n+1},()=>[])
wires.forEach((item,i)=>{
const [from, to] = item;
network[from].push(to);
network[to].push(from);
})
}
1⇒2 , 2⇒3, 3⇒4 이 부분을 순차적으로 절교를 한다고 약속 합시다.
** 어떻게 끊어주나?? ****
1번 , 2번이 절교 ⇒ A카톡방 1명 - B카톡방 3명 ⇒ 2명 차이
그럼 코드를 보며 확인해보겠습니다. 예시를 위해 코드를 바꿔봤는데, 예시가 마음에 안든다 or 이해가 안된다
하시면 바로 밑에 정답코드가 있으니 확인해보시면 되겠습니다.
// 0번째 부터 순차적으로 절교를 하고, 각 카톡방의 인원수 차이가 최소가 되는 경우를 찾는다.
for(let i=0; i<wires.length; i++){
min=Math.min(min, getDiff(i));
}
return min;
function getDiff(index) {
// leftConnection === A 카톡방
// 단 1번의 친구가 2번이고, 3번의 친구가 2번이면 두번 초대하지 말고 한명만 하자~
let leftConnection = new Set();
// from, to는 절교할 예정인 친구를 의미, index번째 날에 from, to는 절교한다.
// Ex) let [2,3] = wires[index] => 2번과 3번은 index번째 날에 절교할 예정
let [from, to] = wires[index];
// from, to는 절교를 했기 때문에 from 친구가 A단톡방을 만듦
leftConnection.add(from);
// 현재 A카톡방에 있는 친구들에게 각자 친구를 초대하라는 코드
// for(소속된 친구 of A카톡방){
for (let v of leftConnection) {
// 소속된 친구들은 각자 친구목록에서 초대할 사람을 확인해봄
network[v].forEach((value) => {
// 초대할 친구가 절교할 친구가 아닌경우
if (value !== to) {
// A 단톡방에 초대!!
leftConnection.add(value);
}
});
}
// 총 친구 목록에서 A카톡방에 있는 친구 * 2를 뺀 경우가 A카톡방과 B카톡방의 인원수 차이
return Math.abs(n - leftConnection.size * 2);
}
}
// 1. 전력망을 만들어줍니다.
// 2. 전력망에서 한개씩 끊어서 2개의 전력망으로 나눠줍니다.
// 3. 2개의 전력망의 각각 송전탑의 개수의 차이를 구하고, 차이값의 최소를 구해줍니다.
function solution(n, wires) {
const network = Array.from({length:n+1},()=>[])
wires.forEach((item,i)=>{
const [from, to] = item;
network[from].push(to);
network[to].push(from);
})
let min = 100;
for(let i=0; i<wires.length; i++){
min=Math.min(min, getDiff(i));
}
return min;
function getDiff(index) {
let leftConnection = new Set();
let [from, to] = wires[index];
leftConnection.add(from);
for (let v of leftConnection) {
network[v].forEach((value) => {
if (value !== to) {
leftConnection.add(value);
}
});
}
return Math.abs(n - leftConnection.size * 2);
}
}