알고리즘/그래프

[이코테] 커리큘럼 (파이썬, 위상정렬)

Jaden Park 2021. 8. 15. 18:48

문제

철수는 라인으로 컴퓨터공학의를 고 있다.

이때 각 온라인의는 의가 있을 수 있는데, 수 의가 있는 의는 수 의를 먼저. 들어야만 해의를 들을 수 있다.

예를들어 '알고리즘’ 강의의  의로 '자료구조' 재한다, ‘자료구조를 들은 이에 ‘알고리즘' 강의를 들을 수 있다.

철수는 총 N 의를  한다. 모든 의는 1부터 N번지의 호를 가진다.

한 동시에 여러 개의 의를 들을 수 있다고 가정한다.

예를 들어 N=3일 때, 3의의 수 의로 1과 2의가 있고, 1과 2의는 의가 다고 가정하.

그리고 각 강의에 대하여 강의 시이 다음과 같다고 가정하.

 

1번 강의: 30시간

2번 강의: 20시간

3번 강의: 40시간

 

이 경우 1번 강의를 수강하기까지의 최소 시간은 30시간, 2번 강의를 수강하기까지의 최소 시간은 20시간, 3번 강의를 수강하기까지의 최소 시간은 70시간이다.

철수가 듣고자 하는 N개의 강의 정보가 주어졌을 때, N개의 강의에 대하여 수강하기까지 걸리는 최소 시간을 각각 출력하는 프로그램을 작성하시오.

 

입력 조건

에 철수가 자 하는 의의 수 N(1≤N≤500)이 주어진다.

다음 N의 에는 각 강의의 의 시과 그. 의를 기 위해 먼저 들어야하는 의들의 호가 수로 주어지며, 각. 자수는 공으로 분한다. 이때 의시은 100,000이하의 수이다 .각 강호는 1부터 N지로 성되며. 각줄은 -1로 다.

 

출력 조건

N개의 강의에 대하여 수강하기까지 걸리는 최소 시간을 한 줄에 하나씩 출력한다

 

입력 예시

5
10 -1
10 1 -1
4 1 -1
4 3 1 -1
3 3 -1

 

출력 예시

10
20
14
18
17

 

문제 풀이

from collections import deque
from copy import deepcopy

n=int(input())
indegree=[0]*(n+1)
graph=[[] for _ in range(n+1)]
time=[0]*(n+1)
inputlist=[list(map(int,input().split())) for _ in range(n)]

for i,in_val in enumerate(inputlist):
    i+=1
    time[i]=in_val[0]
    for val in in_val[1:-1]:
        indegree[i]+=1
        graph[val].append(i)

def topology_sort():
    result=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])

topology_sort()

 

문제 해설

위상 정렬 개념에 대해서 알고 있다면 어렵지 않게 풀 수 있는 문제였다.

기본 개념에서 시간이라는 리스트를 추가하여 높은 시간값을 유지해주면 된다.

 

 

참고 문헌: 이것이 취업을 위한 코딩테스트다. - 나동빈 저자