위상 정렬은 방향성이 있는 그래프(DAG)에서
모든 정점을 선후 관계를 지키며 일렬로 나열하는 알고리즘이다.
예를 들어, 어떤 작업이 다른 작업보다 먼저 수행되어야 한다면,
그 조건을 만족하는 작업 순서를 만들어낼 수 있다.
A → B → C
↓ ↑
D → E → F
위상 정렬 결과 예시: A D E F B C
※ 여러 정답이 존재할 수 있다 (조건만 만족하면 OK)
from collections import deque
def topology_sort(n, graph):
indegree = [0] * n
for u in range(n):
for v in graph[u]:
indegree[v] += 1
queue = deque([i for i in range(n) if indegree[i] == 0])
result = []
while queue:
node = queue.popleft()
result.append(node)
for neighbor in graph[node]:
indegree[neighbor] -= 1
if indegree[neighbor] == 0:
queue.append(neighbor)
return result
# 예제 DAG
graph = {
0: [2],
1: [2, 3],
2: [4],
3: [4],
4: []
}
print("위상 정렬 결과 (BFS):", topology_sort(5, graph))
def dfs_topo_sort(n, graph):
visited = [False] * n
result = []
def dfs(v):
visited[v] = True
for neighbor in graph[v]:
if not visited[neighbor]:
dfs(neighbor)
result.append(v) # 종료 후 삽입
for i in range(n):
if not visited[i]:
dfs(i)
result.reverse()
return result
print("위상 정렬 결과 (DFS):", dfs_topo_sort(5, graph))
항목 | BFS 방식 (진입차수) | DFS 방식 (후위 순회) |
---|---|---|
직관성 | 높음 | 낮음 |
사이클 감지 | 가능 (진입차수 남아있으면) | 직접 구현 필요 |
순서 다양성 | 큐 처리 순서에 따라 달라짐 | DFS 경로에 따라 달라짐 |
실전 활용 | 가장 많이 쓰임 | 트리 응용, 백트래킹에 어울림 |