
일부 학생들의 키를 비교한 결과가 주어졌을 때, 줄을 세우는 프로그램을 만드는 문제이다.
문제를 딱 봤을 때 처음 보는 유형이라는 느낌이 들어 알고리즘 유형 확인 버튼을 바로 눌렀다.
위상정렬이라는 키워드를 보고 먼저 인터넷에 개념을 공부하고 코드에 적용해보려했다.
래퍼런스
방법
이 방법은 위상정렬이 보장된 경우에 가능하다.
N개의 노드를 다 탐색하기 전에 큐가 비어버리면 사이클이 발생한 경우다. 사이클이 있으면 위상정렬이 불가능하다.
해결언어 : Python
import sys
input = sys.stdin.readline
from collections import deque
n, m = map(int, input().split())
degree = [0]*(n+1)
graph = [[] for _ in range(n+1)]
for _ in range(m):
a, b = map(int, input().split())
graph[a].append(b)
degree[b] += 1
result = []
q = deque()
for i in range(1, n+1):
if degree[i] == 0:
q.append(i)
for i in range(1, n+1):
x = q.popleft()
result.append(x)
while graph[x]:
y = graph[x].pop()
degree[y] -= 1
if degree[y] == 0:
q.append(y)
print(*result)

끝으로..
위상정렬에 대해 공부하고 적용해 볼 수 있는 문제였다.