
N명의 학생들을 키 순서대로 줄을 세우려 한다. 학생 A가 학생 B보다 앞에 서야 한다는 M개의 키 비교 정보가 주어질 때, 올바른 줄 세우기 결과를 출력하라.
정답 코드
import sys
input = lambda: sys.stdin.readline().rstrip()
from collections import deque
N, M = map(int, input().split())
graph = [[] for _ in range(N+1)]
in_degree = [0]*(N+1)
q = deque()
for _ in range(M):
A, B = map(int, input().split())
graph[A].append(B)
in_degree[B] += 1
q = []
for i in range(1, N+1):
if in_degree[i] == 0:
q.append(i)
result = []
while q:
node = q.popleft()
result.append(node)
for next_node in graph[node]:
in_degree[next_node] -= 1
if in_degree[next_node] == 0:
q.append(next_node)
print(*result)
시간 복잡도: O(N + M)
- 그래프 생성: O(M)
- 위상 정렬: O((N + M) log N)
참고
- 정답이 여러 개인 위상 정렬 문제에서 채점 시스템이 정해진 순서를 요구할 경우에는
heapq를 사용하여 사전순 정렬이 필요함- 단순한 BFS 위상 정렬이라면
deque로도 충분하지만, 위 조건에서 실패할 수 있음