문제: https://www.acmicpc.net/problem/2252
import sys
from collections import deque
def makeLine():
for i in range(M):
start, end = map(int, sys.stdin.readline().split())
graph[start].append(end)
degree[end] += 1
def order():
startList = []
for i in range(1, N+1):
if degree[i] == 0:
startList.append(i)
queue = deque()
queue.extend(startList)
while queue:
node = queue.popleft()
if f"{node}" not in visited:
for end in graph[node]:
degree[end] -= 1
if degree[end] == 0:
queue.append(end)
visited.append(f"{node}")
N, M = map(int, sys.stdin.readline().split())
graph = {i : [] for i in range(1, N+1)}
degree = [0 for _ in range(N+1)]
visited = []
makeLine()
order()
print(" ".join(visited))
줄 세우는 알고리즘은 줄을 잘 세우다가도 root의 순서가 바뀌어버리면 밑에 따라오던 자식 노드들까지 순서가 바뀌는 경우가 생긴다.
따라서 일반적인 리스트를 따라서 문제를 적용하기 보다는 그래프를 이용해서 푸는게 맞다.
그래프가 있을 때 해당 노드로 들어오는 간선의 개수를 구하여 진입차수로 나타낸 다음 정렬하는 방법이다.
진입차수가 0인 노드부터 순서대로 알고리즘을 따라가는데 다음과 같다.