프로그래밍/Python

[Python] 백준 1516 게임 개발

모영이 2021. 3. 10. 14:29

 

1516번: 게임 개발

첫째 줄에 건물의 종류 수 N(1 ≤ N ≤ 500)이 주어진다. 다음 N개의 줄에는 각 건물을 짓는데 걸리는 시간과 그 건물을 짓기 위해 먼저 지어져야 하는 건물들의 번호가 주어진다. 건물의 번호는 1부

www.acmicpc.net

위상정렬 : 위상정렬 문제를 두번째 푸는 건데 느낌이 비슷한 것 같다. inDegree에 진입차수를 집어넣는게 핵심이다. 진입차수가 0이면 큐에 집어넣고 돌려준다. DP값에는 조건에 맞게 값을 넣어주면 된다.

 

전체코드

import sys
import collections

input = sys.stdin.readline

N = int(input())
times = [0 for _ in range(N + 1)]
dp = [0 for _ in range(N + 1)]
inDegree = [0 for _ in range(N + 1)]
graph = collections.defaultdict(list)
for i in range(1, N + 1):
    tmp = list(map(int, input().split()))
    times[i] = tmp[0]
    tmp = tmp[1:-1]
    for j in tmp:
        graph[j].append(i)
    inDegree[i] = (len(tmp))

queue = collections.deque()
for i in range(1, N + 1):
    if inDegree[i] == 0:
        queue.append(i)
        dp[i] = times[i]

while queue:
    node = queue.popleft()
    for i in graph[node]:
        inDegree[i] -= 1
        dp[i] = max(dp[node] + times[i], dp[i])
        if inDegree[i] == 0:
            queue.append(i)

for i in range(1, N + 1):
    print(dp[i])

'프로그래밍 > Python' 카테고리의 다른 글

[Python] 백준 2056 작업  (0) 2021.03.10
[Python] 백준 1766 문제집  (0) 2021.03.10
[Python] 백준 2011 암호코드  (0) 2021.03.08
[Python] 백준 15663 N과 M (9)  (0) 2021.03.08
[Python] 백준 1167 트리의 지름  (0) 2021.03.08