코딩하는 해맑은 거북이
[Python] 게임 개발 - 백준 (위상정렬) 본문
해당 글은 백준 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])
'코딩테스트' 카테고리의 다른 글
[Python] 음악프로그램 - 백준 (위상정렬) (0) | 2023.09.11 |
---|---|
[Python] 별자리 만들기 - 백준 (MST) (0) | 2023.09.11 |
[Python] 치즈 - 백준 (BFS) (0) | 2023.09.04 |
[Python] 거짓말 - 백준 (0) | 2023.09.01 |
[Python] 네트워크 연결 - 백준 (MST) (0) | 2023.08.30 |
Comments