웹찢남

[백준 2252 줄 세우기 문제] PYTHON 본문

백준 Algorithm

[백준 2252 줄 세우기 문제] PYTHON

harry595 2021. 8. 18. 00:02

 

이 문제는 위상 정렬을 사용해서 푸는 문제다.

위상 정렬이란 사이클이 없고 방향만 존재하는 vertex를 나열하는 것이다.

이 문제에선 키를 비교한 리스트에서 자신을 참조한 (자신보다 앞에선) vertex가 0인 것을 큐에 넣는다.

- 여기서 무조건 맨 뒤에 있는 vertex는 0이므로 무조건 값이 있음 -

그 후 queue를 while문을 통해 돌리며 자신을 참조한 value들의 참조값을 -1 하며

queue 내의 index를 remove하고 다시 참조값이 0인 vertex를 append하며 반복을 하면 된다.

 

코드로 구현하면 아래와 같다.

N, M = map(int, input().split())
indegree = [0 for i in range(N+1)]
Tlist = [[] for i in range(N+1)]
queue = []
answer = []
for _ in range(M):
    a, b = map(int, input().split())
    Tlist[a].append(b)
    indegree[b] += 1

for j in range(1, N+1):
    if indegree[j] == 0:
        queue.append(j)

while(queue):
    for i in queue:
        answer.append(i)
        queue.remove(i)
        for t in Tlist[i]:
            indegree[t] -= 1
            if(indegree[t] == 0):
                queue.append(t)

for ans in answer:
    print(ans, end=" ")

 

Comments