import heapq
import sys
input = sys.stdin.readline
def BOJ1516() :
N = int(input())
time = [0 for _ in range(N+1)]
graph = [[] for _ in range(N+1)]
indegree = [0 for _ in range(N+1)]
queue = []
result = [0 for _ in range(N+1)]
for i in range(1, N + 1) :
temp = list(map(int, input().split()))
time[i] = temp[0]
temp_graph = temp[1:-1]
indegree[i] = len(temp_graph)
for k in temp_graph :
graph[k].append(i)
for i in range(1, N+1) :
if indegree[i] == 0 :
heapq.heappush(queue, (time[i], [i, time[i]]))
while queue :
_, [curr, curr_time] = heapq.heappop(queue)
result[curr] = curr_time
for i in graph[curr] :
indegree[i] -= 1
if indegree[i] == 0 :
next_time = curr_time + time[i]
heapq.heappush(queue, (next_time, [i, next_time]))
for i in range(1, N+1) :
print(result[i])
BOJ1516()
접근방법 :
1. 입력이 되게 까다로웠던 문제인걸로 기억한다.
2.다른 건물을 선행해서 지어야 하는 조건이 있으므로 위상정렬을 적용했고 동시에 여러개의 건물을 지을수 있다는 점과 최소시간을 출력해야 한다는 점으로 말미암아 우선순위 큐를 적용하였다.
이전 포스팅에서 우선순위 큐를 적용하는 이유를 참고할 수 있다.
https://www.acmicpc.net/problem/1516
1516번: 게임 개발
첫째 줄에 건물의 종류 수 N(1 ≤ N ≤ 500)이 주어진다. 다음 N개의 줄에는 각 건물을 짓는데 걸리는 시간과 그 건물을 짓기 위해 먼저 지어져야 하는 건물들의 번호가 주어진다. 건물의 번호는 1부
www.acmicpc.net
'알고리즘' 카테고리의 다른 글
연속합 [백준 1912] - python (0) | 2022.03.05 |
---|---|
계단 오르기 [백준 2579] - python (0) | 2022.03.04 |
작업 [백준 2056] - python (0) | 2022.03.02 |
문제집 [백준 1766] - python (0) | 2022.03.01 |
음악프로그램 [백준 2623] - python (0) | 2022.02.28 |