문제
https://programmers.co.kr/learn/courses/30/lessons/86971
코딩테스트 연습 - 9주차
9 [[1,3],[2,3],[3,4],[4,5],[4,6],[4,7],[7,8],[7,9]] 3 7 [[1,2],[2,7],[3,7],[3,4],[4,5],[6,7]] 1
programmers.co.kr
풀이
다음과 같은 예시인 경우 , 6:3 으로 나누면 차이가 최소가 된다.
즉 , 차이가 최소이기 위해선 한쪽편에 해당되는 노드의 자식수를 a 라고하고
전체 노드의 수n-a 를 다른 한쪽편의 노드들이라고 했을때
구해야 하는 최소값을 min 이라고 하자.
min(n-2a , min) 이 답이다.
1. 1번 노드를 root 로 기준을 잡고 시작하여
2. 해당 노드의 자식수를 구하기 위해 dfs 탐색을하여 부모노드의 갯수를 증가시켜주는 것
3. 노드 자식수를 기록한 배열(sub)을 순차적으로 돌면서 최소값을 구하면 끝
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
import java.util.*;
import java.io.*;
class Solution {
static ArrayList<Integer>[] list;
static boolean[] visit;
static int[] sub;
public int solution(int n, int[][] wires) {
list = new ArrayList[n+1];
visit = new boolean[n+1];
sub = new int[n+1];
for(int i=1;i<=n;i++){
list[i] = new ArrayList<>();
}
for (int[] wire : wires) {
list[wire[0]].add(wire[1]);
list[wire[1]].add(wire[0]);
}
dfs(1,0);
int min=Integer.MAX_VALUE;
for(int i=1;i<=n;i++){
sub[i]++;
int diff = Math.abs(n-sub[i]-sub[i]);
min = Math.min(min,diff);
}
// System.out.println("min = " + min);
return min;
}
public static void dfs(int x,int parent){
visit[x] = true;
for (Integer next : list[x]) {
if(visit[next])
continue;
dfs(next,x);
sub[x]++;
}
sub[parent]+=sub[x];
}
}
|
cs |
'알고리즘,PS > 프로그래머스' 카테고리의 다른 글
[프로그래머스] [Level2] 소수찾기 JAVA (0) | 2021.10.20 |
---|---|
[프로그래머스] [위클리 챌린지 11주차] 아이템줍기 JAVA (2) | 2021.10.19 |
[BOJ] 백준 [9466] 텀 프로젝트 JAVA (0) | 2021.10.17 |
[프로그래머스] [level3] 디스크 컨트롤러 JAVA (0) | 2021.10.11 |
[프로그래머스] 섬 연결하기[Level3] JAVA (0) | 2021.08.09 |