Skip to content

Commit 5ccea4e

Browse files
authored
Merge pull request #116 from AlgorithmStudy-Allumbus/minjeong
feat: 1월 1주차 발제 문제 내용
2 parents 1ed49b0 + 1e6ffb7 commit 5ccea4e

File tree

4 files changed

+94
-0
lines changed

4 files changed

+94
-0
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
'''
2+
BOJ #1949. 우수마을 (골드2)
3+
https://www.acmicpc.net/problem/1949
4+
유형: Dynamic Programming(DP), Tree DP, tree
5+
'''
6+
import sys
7+
8+
input = sys.stdin.readline
9+
sys.setrecursionlimit(10 ** 6) # 재귀 깊이 설정 (10만)
10+
11+
# 1. 입력 받기
12+
N = int(input()) # 마을 개수
13+
people = [0] + list(map(int, input().split())) # 각 마을 주민 수 (인덱스 맞추기 위해 0 추가)
14+
15+
# 2. 마을 연결 (트리 구성)
16+
town = [[] for _ in range(N + 1)]
17+
18+
for _ in range(N - 1):
19+
u, v = map(int, input().split())
20+
town[u].append(v)
21+
town[v].append(u)
22+
23+
# 3. DP 테이블 초기화 및 방문 리스트
24+
dp = [[0, 0] for _ in range(N + 1)] # dp[i][0]: 우수 마을 X, dp[i][1]: 우수 마을 O
25+
visited = [False] * (N + 1)
26+
27+
28+
# 4. DFS를 통한 서브트리 탐색 및 DP 계산
29+
def dfs(current):
30+
visited[current] = True # 현재 노드 방문 처리
31+
dp[current][1] += people[current] # 현재 마을을 우수 마을로 선정한 경우 (자기 자신 포함)
32+
33+
for child in town[current]:
34+
if not visited[child]:
35+
dfs(child) # 자식 노드로 DFS 진행
36+
dp[current][1] += dp[child][0] # 자식 노드가 우수 마을이 아닌 경우 주민 수 더하기
37+
dp[current][0] += max(dp[child][0], dp[child][1]) # 자식 노드에서 우수 마을이거나 아닌 경우 중 최대값 선택
38+
39+
40+
# 5. DFS 호출 (루트 노드 1부터 시작)
41+
dfs(1)
42+
43+
# 6. 결과 출력
44+
print(max(dp[1][0], dp[1][1]))
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
## 🚀1월 1주차 (12/30) 스터디 발제 주제: Tree Dynamic Programming
2+
> 발제자: 김민정 (@Mingguriguri)
3+
4+
### 🗂️ 스터디 자료
5+
- PDF: [바로가기](https://github.com/AlgorithmStudy-Allumbus/codingtest_algorithm_study/blob/main/_WeeklyChallenges/W02-%5BDP%5D/Study_BOJ_1125.pdf)
6+
7+
### 📖 문제
8+
- [백준 #15681. 트리와 쿼리](https://www.acmicpc.net/problem/15681): Tree DP / 골드5
9+
- 정답 코드: [Study_BOJ_15681_트리와쿼리.py](https://github.com/AlgorithmStudy-Allumbus/codingtest_algorithm_study/blob/main/_WeeklyChallenges/W02-%5BDP%5D/Study_BOJ_12865_%ED%8F%89%EB%B2%94%ED%95%9C%EB%B0%B0%EB%82%AD.py#L1-L30)
10+
11+
### 💻 과제
12+
- [백준 #1949. 우수마을](https://www.acmicpc.net/problem/1949): Tree DP / 골드2
13+
- 정답 코드: [Assignment_BOJ_1949_우수마을.py](https://github.com/AlgorithmStudy-Allumbus/codingtest_algorithm_study/blob/main/_WeeklyChallenges/W02-%5BDP%5D/Assignment_BOJ_17845_%EC%88%98%EA%B0%95%EA%B3%BC%EB%AA%A9.py#L1-L20)
705 KB
Binary file not shown.
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
'''
2+
BOJ #15681. 트리와 쿼리(골드5)
3+
https://www.acmicpc.net/problem/15681
4+
유형: Dynamic Programming(DP), Tree DP, tree
5+
'''
6+
import sys
7+
input = sys.stdin.readline
8+
sys.setrecursionlimit(10**6) # 재귀 깊이 제한 설정(10만)
9+
10+
# 1. 입력 처리
11+
N, R, Q = map(int, input().split()) # 정점 수, 루트 번호, 쿼리 수
12+
graph = [[] for _ in range(N + 1)] # 트리 그래프
13+
14+
# 2. 트리 정보 입력
15+
for _ in range(N - 1):
16+
u, v = map(int, input().split())
17+
graph[u].append(v)
18+
graph[v].append(u)
19+
20+
# 3. 서브트리 크기 기록 배열
21+
size = [0] * (N + 1)
22+
23+
# 4. DFS를 이용한 서브트리 크기 계산
24+
def countSubtreeNodes(current):
25+
size[current] = 1 # 자기 자신 포함
26+
for node in graph[current]:
27+
if size[node] == 0: # 아직 방문하지 않은 경우
28+
countSubtreeNodes(node)
29+
size[current] += size[node] # 자식 서브트리 크기 추가
30+
31+
# 5. 루트에서 시작해 서브트리 크기 계산
32+
countSubtreeNodes(R)
33+
34+
# 6. 쿼리 처리
35+
for _ in range(Q):
36+
U = int(input())
37+
print(size[U])

0 commit comments

Comments
 (0)