https://www.acmicpc.net/problem/2533


인생 첫 트리에서의 다이나믹 프로그래밍... 이어서 고민을 제법 많이 했다.
먼저 트리에서 다이나믹 프로그래밍을 어떻게 하지? 했는데 DFS를 활용하는 듯했다.
https://orijeje.tistory.com/40
[알고리즘] 트리에서의 다이나믹 프로그래밍(Tree DP)
tree dp 이전에 일반적인 dp에 대해 살짝 이야기하고 tree dp로 넘어가려 한다. 먼저 어떤 문제를 dp로 풀기 위해서는 다음 3가지 조건을 만족해야 한다. 1) 큰 문제를 작은 문제로 나눌 수 있다. 2) 충
orijeje.tistory.com
위 블로그에서 DFS를 기반으로한 DP 코드를 간단하게 적어두어 이를 참고했다.
void dfs(int cur){
if(visited[cur])
return;
visited[cur] = 1;
for(auto next : tree[cur]){
if(visited[next])
continue;
dfs(next);
//dp 테이블을 채우는 어떠한 코드
dp[cur] = fill_dp_table(next);
}
}
이후 내가 생각한 얼리어답터의 조건은 다음과 같았다.
1. node의 자식이 하나라도 leaf이면 node는 얼리어답터이다.
2. 현재, node가 얼리어답터가 아닌데, 자식도 얼리어답터가 아니라면, node는 얼리어답터이다.
다음의 조건으로 코드를 짜보았다.
# https://www.acmicpc.net/problem/2533
# DP, Tree
from collections import defaultdict
import sys
sys.setrecursionlimit(1000000000)
N = int(input())
graph = defaultdict(list)
for n in range(N-1) :
u, v = map(int, sys.stdin.readline().split())
graph[u].append(v)
graph[v].append(u)
visited = [0] * (N+1)
early_adaptor = [0] * (N+1)
is_leaf = [0] * (N+1)
def DFS(node) :
global graph
global is_leaf
global visited
global early_adaptor
if visited[node] != 0 :
return
visited[node] = 1
if len(graph[node]) == 1 and visited[node] == 1 :
is_leaf[node] = 1
for e in graph[node] :
if visited[e] :
continue
DFS(e)
if is_leaf[e] == 1 :
early_adaptor[node] = 1
elif early_adaptor[node] == 0 and early_adaptor[e] == 0 :
early_adaptor[node] = 1
DFS(1)
print(sum(early_adaptor))
얼리어답터일 때, early_adaptor 배열에 해당하는 node번째에 1을 할당하고
나중에 정답은 sum(early_adaptor)로 하여 전체 최소 얼리어답터 수를 구했다.
'코테풀이 > 백준' 카테고리의 다른 글
| 14725번: 개미굴 (0) | 2025.10.10 |
|---|---|
| 15681번: 트리와 쿼리 (0) | 2025.10.02 |
| 7569번: 토마토 (0) | 2025.09.24 |
| 10026번: 적록색약 (1) | 2025.09.15 |
| 14502번: 연구소 (0) | 2025.09.13 |