1. 유형
깊이 우선 탐색, 트리
2. 문제 접근
2-1. 해설
우선 저는 현재 위치와 leaf노드까지의 깊이를 탐색했습니다.
그림 1처럼 만드는 것은 재귀를 사용해서 return값에 +1을 해주면 됩니다.
하지만 저기서도 문제가 있습니다.
2,3,4 노드 같은 여러 가지로 뻗어나가는 부분이 까다롭습니다.
그래서 그림2 처럼 여러 가지로 뻗어나가는 경우는 리턴 값 중 최댓값을 노드의 깊이로 선택하면 됩니다.
그림 1처럼 노드의 최대 깊이를 탐색했으면 D보다 큰 녀석들의 갯수를 카운트해주고, 왕복이니깐 *2를 해주면 정답이 나옵니다.
2-2. 설계
3. 코드
import java.io.*;
import java.util.*;
public class Main {
static boolean visit[];
static int N,M,D,dp[];
static List<Integer> list[];
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(in.readLine());
N = stoi(st.nextToken());
M= stoi(st.nextToken());
D= stoi(st.nextToken());
list= new ArrayList[N+1];
visit= new boolean[N+1];
dp = new int[N+1];
for(int i=0; i<=N; i++) {
list[i]=new ArrayList<>();
}
for(int i=0; i<N-1; i++) {
st = new StringTokenizer(in.readLine());
int a=stoi(st.nextToken());
int b=stoi(st.nextToken());
list[a].add(b);
list[b].add(a);
}
visit[M]=true;
dfs(M);
int ans=0;
for(int i=1; i<=N; i++) {
if(i!=M && dp[i]>=D) {
ans++;
}
}
System.out.println(ans*2);
}
static int dfs(int node) {
int val=0;
for(int next: list[node]) {
if(!visit[next]) {
visit[next]=true;
val=Math.max(val, dfs(next));
}
}
dp[node] = val;
return dp[node]+1;
}
static int stoi(String s) {
return Integer.valueOf(s);
}
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 1937 - 욕심쟁이 판다 (0) | 2021.09.18 |
---|---|
백준 2146 - 다리 만들기 (0) | 2021.09.10 |
백준 16202 - MST게임 (0) | 2021.09.08 |
백준 - 2406 안정적인 네트워크 (0) | 2021.09.07 |
백준 17090 - 미로 탈출하기 (0) | 2021.09.03 |