코딩하는 해맑은 거북이

[Python] 게임 개발 - 백준 (위상정렬) 본문

코딩테스트

[Python] 게임 개발 - 백준 (위상정렬)

#CJE 2023. 9. 9.
해당 글은 백준 1516번 '게임 개발' 문제를 다룬다.

문제

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

 

1516번: 게임 개발

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

www.acmicpc.net

 

설명

해당 문제는 순서가 정해져있는 일련의 작업을 차례대로 수행할 때 사용하는 위상 정렬 알고리즘으로 해결할 수 있다.

저장할 그래프는 방향이 있으므로 노드 A에서 노드 B로 갈 때의 간선만 저장한다.

또한, 결과값을 담는 result는 time 리스트를 깊은복사하여 사용한다.

 

코드

from collections import deque
import copy

n = int(input())
indegree = [0]*(n+1)
graph = [[] for _ in range(n+1)]
time = [0]*(n+1)

for i in range(1, n+1):
    data = list(map(int, input().split()))
    time[i] = data[0]
    for j in data[1:-1]:
        indegree[i] += 1
        graph[j].append(i)

result = copy.deepcopy(time)
q = deque()

for i in range(1, n+1):
    if indegree[i] == 0:
        q.append(i)

while q:
    now = q.popleft()
    for i in graph[now]:
        result[i] = max(result[i], result[now]+time[i])
        indegree[i] -= 1
        if indegree[i] == 0:
            q.append(i)

for i in range(1, n+1):
    print(result[i])

     

 

 

Comments