
#valid tree #tree #dfs #트리
트리(무방향 그래프)에서 각 노드에 대해 “등불을 켜야 하는지” 여부를 판단하여, 최소 개수의 등불(Answer)을 설치하는 문제이다.
dfs 문제이다.
기억할 만한 점은 총 3가지이다.
Graph.get(current).size() == 1 && Graph.get(current).get(0) == previous): 기저 조건: 현재 노드가 리프 노드인 경우. 리프 노드는 부모(previous) 외에 이웃이 없으므로, Graph.get(current).size() == 1이고, 그 유일한 이웃이 previous 이다.중간 노드인지 리프 노드인지 확인하는 방법을 배운 좋은 문제였다.
import java.util.*;
class Solution {
ArrayList<ArrayList<Integer>> Graph = new ArrayList<ArrayList<Integer>>();
private static int Answer = 0;
public int solution(int n, int[][] lighthouse) {
for (int i = 0; i <= n; ++i) {
Graph.add(new ArrayList<>());
}
for (int[] light : lighthouse) {
int a = light[0];
int b = light[1];
Graph.get(a).add(b);
Graph.get(b).add(a);
}
dfs(1, 0);
return Answer;
}
private int dfs(int current, int previous) {
if (Graph.get(current).size() == 1 && Graph.get(current).get(0) == previous) {
return 1;
}
int shouldLightOn = 0;
for (int next : Graph.get(current)) {
if (next == previous) {
continue;
}
shouldLightOn += dfs(next, current);
}
if (shouldLightOn == 0) {
return 1;
} else {
++Answer;
}
return 0;
}
}