그리디 알고리즘
, dfs
https://www.acmicpc.net/problem/1135
import java.io.*;
import java.util.*;
public class Main {
static List<Integer>[] childNodes;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
childNodes = new List[n];
for (int i = 0; i < n; i++) {
childNodes[i] = new ArrayList<>();
int parent = Integer.parseInt(st.nextToken());
if (parent >= 0) {
childNodes[parent].add(i);
}
}
System.out.println(dfs(0));
}
public static int dfs(int nodeNum) {
if (childNodes[nodeNum].isEmpty()) {
return 0;
}
List<Integer> times = new ArrayList<>();
for (Integer childNodeNum : childNodes[nodeNum]) {
times.add(dfs(childNodeNum));
}
Collections.sort(times, Collections.reverseOrder());
int maxTime = Integer.MIN_VALUE;
for (int i = 0; i < times.size(); i++) {
maxTime = Math.max(times.get(i) + i + 1, maxTime);
}
return maxTime;
}
}
List<Integer> times = new ArrayList<>();
for (Integer childNodeNum : childNodes[nodeNum]) {
times.add(dfs(childNodeNum));
}
Collections.sort(times, Collections.reverseOrder());
int maxTime = Integer.MIN_VALUE;
for (int i = 0; i < times.size(); i++) {
maxTime = Math.max(times.get(i) + i + 1, maxTime);
}
2시간 30분
정답 코드까지 접근하는 데 굉장히 오래 걸린 문제였습니다. 특히, 내림차순 정렬 및 depth + 이전 자식 노드 전파 시간 + 자식 노드 전파 시간(=1)을 떠올리기 어려웠습니다.