[Gold III] Title: 게임 개발, Time: 88 ms, Memory: 37104 KB -BaekjoonHub
This commit is contained in:
32
백준/Gold/1516. 게임 개발/README.md
Normal file
32
백준/Gold/1516. 게임 개발/README.md
Normal 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>
|
||||
|
||||
36
백준/Gold/1516. 게임 개발/게임 개발.py
Normal file
36
백준/Gold/1516. 게임 개발/게임 개발.py
Normal 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])
|
||||
Reference in New Issue
Block a user