문제
https://www.acmicpc.net/problem/1135
풀이(21분)
import java.util.*;
import java.io.*;
public class Main {
// 자식 중에 가장 긴 것 + 자기 자식의 개수만큼 시간이 걸림
// 즉, 최상단에서부터 재귀로 하위를 탐색하면 됨.
static Map<Integer, List<Integer>> boss = new HashMap<>();
static int[] dp;
static int n;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
n = Integer.parseInt(br.readLine());
dp = new int[n];
for(int i = 0; i < n; i++){
boss.put(i, new ArrayList<>());
}
st = new StringTokenizer(br.readLine());
st.nextToken();
for(int i = 1; i < n; i++){
int owner = Integer.parseInt(st.nextToken());
boss.get(owner).add(i);
}
int time = dfs(0);
System.out.println(time);
}
static int dfs(int start){
if(dp[start] != 0){
return dp[start];
}
List<Integer> list = new ArrayList<>(); // 자식에 대해 시간이 오래 걸리는 것을 담아두기 위한 리스트
for(Integer i : boss.get(start)){
list.add(dfs(i)); // dfs에 추가
}
Collections.sort(list, Collections.reverseOrder());
int addTime = 1; // 자식까지 가는데의 소요 시간
for(Integer i : list){
dp[start] = Math.max(i+addTime, dp[start]);
addTime++;
}
return dp[start];
}
}
문제 풀이 전략
1. dp를 통해 탐색한 것에 대해 더 이상 탐색하지 않게 dfs를 진행한다.
2. 진행 과정에서 자식마다의 소요 시간을 구하고, 내림차순으로 정렬한 뒤 +1 씩 하며 최대 시간을 dp[i]로 정한다.
3. 이 과정을 모든 인덱스에 대해 진행한다.
4. 최종적으로 dp[0]이 출력된다.
'문제 풀이 > 백준' 카테고리의 다른 글
[백준] 2812번. 크게 만들기(JAVA) (0) | 2025.05.30 |
---|---|
[백준] 17825번. 주사위 윷놀이(JAVA) (1) | 2025.05.28 |
[백준] 4195번. 친구 네트워크(JAVA) (0) | 2025.05.27 |
[백준] 14658번. 하늘에서 별똥별이 빗발친다(JAVA) (0) | 2025.05.26 |
[백준] 10423번. 전기가 부족해(JAVA) (0) | 2025.05.26 |