https://school.programmers.co.kr/learn/courses/30/lessons/86971
import java.util.*;
class Solution {
int answer;
public int solution(int n, int[][] wires) {
answer = n;
Map<Integer, List<Integer>> graph = new HashMap<>();
for(int i = 1; i <= n; i++){
graph.put(i, new ArrayList<>());
}
for(int[] wire : wires){
graph.get(wire[0]).add(wire[1]);
graph.get(wire[1]).add(wire[0]);
}
boolean[] visited = new boolean[n + 1];
dfs(n, visited, graph, 1);
return answer;
}
int dfs(int n, boolean[] visited, Map<Integer, List<Integer>> graph, int cur){
visited[cur] = true;
int count = 1; //현재 노드를 포함한 서브트리의 노드 수
for(int next : graph.get(cur)){
if(!visited[next]){
//서브트리의 노드수에 더하여 dfs 반복
count += dfs(n, visited, graph, next);
}
}
answer = Math.min(answer, Math.abs( n - count * 2));
return count; //자신과 연결된 자식노드의 수를 반환하여 부모 노드에 누적할 수 있게 함
}
}