[Gold III] Title: 게임 개발, Time: 88 ms, Memory: 37104 KB -BaekjoonHub

This commit is contained in:
SSUM
2025-02-28 14:55:38 +09:00
parent fdabfec2bd
commit 365712e463
2 changed files with 68 additions and 0 deletions

View File

@@ -0,0 +1,32 @@
# [Gold III] 게임 개발 - 1516
[문제 링크](https://www.acmicpc.net/problem/1516)
### 성능 요약
메모리: 37104 KB, 시간: 88 ms
### 분류
방향 비순환 그래프, 다이나믹 프로그래밍, 그래프 이론, 위상 정렬
### 제출 일자
2025년 2월 28일 14:55:31
### 문제 설명
<p>숌 회사에서 이번에 새로운 전략 시뮬레이션 게임 세준 크래프트를 개발하기로 하였다. 핵심적인 부분은 개발이 끝난 상태고, 종족별 균형과 전체 게임 시간 등을 조절하는 부분만 남아 있었다.</p>
<p>게임 플레이에 들어가는 시간은 상황에 따라 다를 수 있기 때문에, 모든 건물을 짓는데 걸리는 최소의 시간을 이용하여 근사하기로 하였다. 물론, 어떤 건물을 짓기 위해서 다른 건물을 먼저 지어야 할 수도 있기 때문에 문제가 단순하지만은 않을 수도 있다. 예를 들면 스타크래프트에서 벙커를 짓기 위해서는 배럭을 먼저 지어야 하기 때문에, 배럭을 먼저 지은 뒤 벙커를 지어야 한다. 여러 개의 건물을 동시에 지을 수 있다.</p>
<p>편의상 자원은 무한히 많이 가지고 있고, 건물을 짓는 명령을 내리기까지는 시간이 걸리지 않는다고 가정하자.</p>
### 입력
<p>첫째 줄에 건물의 종류 수 N(1 ≤ N ≤ 500)이 주어진다. 다음 N개의 줄에는 각 건물을 짓는데 걸리는 시간과 그 건물을 짓기 위해 먼저 지어져야 하는 건물들의 번호가 주어진다. 건물의 번호는 1부터 N까지로 하고, 각 줄은 -1로 끝난다고 하자. 각 건물을 짓는데 걸리는 시간은 100,000보다 작거나 같은 자연수이다. 모든 건물을 짓는 것이 가능한 입력만 주어진다.</p>
### 출력
<p>N개의 각 건물이 완성되기까지 걸리는 최소 시간을 출력한다.</p>

View File

@@ -0,0 +1,36 @@
import sys
import math
from collections import deque
input = sys.stdin.readline
N = int(input())
time = [0] * (N+1)
build_time = [0] * (N+1)
a = [[] for _ in range(N+1)]
indegree = [0] * (N+1)
for i in range(1, N+1):
temp = list(map(int, input().split()))
build_time[i] = temp[0]
time[i] = temp[0]
for k in temp[1:-1]:
a[k].append(i)
indegree[i] += 1
queue = deque()
for i in range(1, N+1):
if(indegree[i]==0):
queue.append(i)
while queue:
curr = queue.popleft()
for next in a[curr]:
indegree[next] -= 1
build_time[next] = max(build_time[next], build_time[curr] + time[next])
if indegree[next] == 0:
queue.append(next)
for i in range(1, N+1):
print(build_time[i])