[BOJ] Q1516 게임 개발

Question

Language: Python

Difficulty: Gold 3

해당 문제는 각 건물에 대해 건물을 지을 수 있는 시간을 구하는 문제로, 각 건물에 대해 먼저 지어져야하는 건물이 있는 경우 해당 건물이 지어져야 현재 건물을 지을 수 있다. 이 처럼, 각 건물에 대해 선입 조건이 있는 경우를 고려해야하며 이러한 유형의 문제는 Topological Sorting을 통해 건물 순서에 대한 정렬을 수행한다.

Solution

from collections import deque
from math import inf

def solution():
    distances=[0]*n
    graph=[[] for _ in range(n)]
    processing_time=[0]*n
    indegrees=[0]*(n)
    
    #간선을 연결해주는 작업 --> 각각의 간선은 건물 간에 우선순위를 의미한다. a->b인 경우 b를 짓기 위해 a가 지어져야함을 의미한다.
    for vertex in range(n):
        processing_time[vertex]=edges[vertex][0]

        for adj_vertex in edges[vertex][1:]:
            if adj_vertex ==-1:
                break
            graph[adj_vertex-1].append(vertex)
        
            indegrees[vertex]+=1

    queue=deque()
    #들어오는 간선이 없는 노드들을 큐에 삽입한다.
    for vertex in range(n):
        if indegrees[vertex]==0:
            queue.append(vertex)
            distances[vertex]=processing_time[vertex]
    
    #topological sorting을 진행하면서 각 노드에 도달할 수 있는 가장 마지막 시간대를 구하는 것을 통해 모든 선제 조건들이 만족되도록 한다.
    while queue:
        vertex=queue.popleft()
        for adj_vertex in graph[vertex]:
            distances[adj_vertex]=max(distances[adj_vertex],distances[vertex]+processing_time[adj_vertex])
            indegrees[adj_vertex]-=1

            if indegrees[adj_vertex]==0:
                queue.append(adj_vertex)
        
    
    for distance in distances:
        print(distance)

if __name__ == "__main__":
    n=int(input())
    edges=[list(map(int,input().split())) for _ in range(n)]

    solution()

댓글남기기