[골드 3] 백준 16437 - 양 구출 작전 (파이썬)
글 작성자: pental

https://www.acmicpc.net/problem/16437
풀이
- 각 섬에는 양(S) 또는 늑대(W)가 있으며,
- 한 섬에 있는 동물들은 연결된 부모 섬(루트 방향)으로 이동한다.
- 만약 늑대 수가 양보다 많으면 그만큼 양이 잡아먹힌다.
- 목표: 1번 섬(루트)에 도착할 수 있는 양의 최대 수 구하기
입력처리는 다음과 같이 지정한다.
N = int(input()) # 섬의 개수 A = [0] * N # 각 노드에 있는 양 또는 늑대 수 (양은 양수, 늑대는 음수) child = [[] for _ in range(N)] # 트리 구조 저장 (부모 -> 자식)
for i in range(1, N) : t, a, p = input().split() a = int(a) p = int(p) - 1 if t == 'S' : A[i] = a # 양이면 그대로 저장 else : A[i] = -a # 늑대이면 음수로 저장 child[p].append(i) # 부모 노드에 자식 추가
입력에서 2번째 노드부터 시작하고, 부모-자식 구조를 트리로 구성한다.
D = [0] * N # 각 노드에서 구해올 수 있는 양의 수 def dfs(u) : D[u] = A[u] # 현재 노드의 양 또는 늑대 수 for v in child[u] : dfs(v) # 자식 노드 먼저 탐색 (후위 순회) D[u] += D[v] # 자식 노드로부터 구해온 양 수 더함 if D[u] < 0 : D[u] = 0 # 늑대가 많아서 잡아먹으면 양 수는 0
DFS + DP를 수행하며, DFS를 하면서 자식 노드들로 부터 구해올 수 있는 최대 양을 누적한다.
이떄 누적 후 0보자 작으면 양이 다 잡아먹힌 것이므로 0으로 초기화한다.
마지막에 dfs(0)을 통해서 루트 노드에서 시작해 전체 DFS를 돌린 후, 루트에서 구할 수 있는 양의 총합을 출력한다.
코드
# 백준 16437 - 양 구출 작전 # 분류 : 다이나믹 프로그래밍 import sys sys.setrecursionlimit(12345678) N = int(input()) A = [0] * N child = [[] for _ in range(N)] for i in range(1, N) : t, a, p = input().split() a = int(a) p = int(p) - 1 if t == 'S' : A[i] = a else : A[i] -= a child[p].append(i) D = [0] * N def dfs(u) : D[u] = A[u] for v in child[u] : dfs(v) D[u] += D[v] if D[u] < 0 : D[u] = 0 dfs(0) print(D[0])
이 글은
본 저작자 표시, 비영리 규칙 하에 배포할 수 있습니다. 자세한 내용은 Creative Commons 라이선스를 확인하세요.
Creative Commons
본 저작자 표시
비영리
'Programming > 백준' 카테고리의 다른 글
[골드 2] 백준 2381 - 최대 거리 (파이썬) (0) | 2025.04.25 |
---|---|
[실버 4] 백준 2980 - 도로와 신호등 (파이썬) (0) | 2025.04.25 |
[골드 1] 백준 2213 - 트리의 독립집합 (파이썬) (0) | 2025.04.24 |
[실버 4] 백준 11508 - 2+1 세일 (파이썬) (0) | 2025.04.24 |
[골드 5] 백준 15989 - 1, 2, 3 더하기 4 (파이썬) (0) | 2025.04.23 |
댓글
이 글 공유하기
다른 글
-
[골드 2] 백준 2381 - 최대 거리 (파이썬)
[골드 2] 백준 2381 - 최대 거리 (파이썬)
2025.04.25 -
[실버 4] 백준 2980 - 도로와 신호등 (파이썬)
[실버 4] 백준 2980 - 도로와 신호등 (파이썬)
2025.04.25 -
[골드 1] 백준 2213 - 트리의 독립집합 (파이썬)
[골드 1] 백준 2213 - 트리의 독립집합 (파이썬)
2025.04.24 -
[실버 4] 백준 11508 - 2+1 세일 (파이썬)
[실버 4] 백준 11508 - 2+1 세일 (파이썬)
2025.04.24
댓글을 사용할 수 없습니다.