시작하기전 이두가지는 아는게 편할것같아서 넣어보았다.
그럼 시작해보자
위상 정렬(topological sorting)은 유향 그래프의 꼭짓점들(vertex)을 변의 방향을 거스르지 않도록 나열하는 것을 의미한다. 위상정렬을 가장 잘 설명해 줄 수 있는 예로 대학의 선수과목(prerequisite) 구조를 예로 들 수 있다.-위키피디아-
대학의 선수과목 예시:
대학에서 어떤 과목을 듣기 전에 반드시 선행해야 하는 과목들이 있을 수 있습니다.
예를 들어, 수학1을 먼저 듣고 수학2를 들어야 하고, 수학2를 들은 후에 수학3을 들을 수 있다고 해봅시다.
수학1 → 수학2 → 수학3 이런 식으로 과목들 간의 의존성이 있죠.
이때 위상정렬을 사용하면 과목들을 들을 순서를 정해줄 수 있어요. 즉, 수학1 → 수학2 → 수학3 이런 식으로 순서를 자동으로 정해주는 거죠.
이 과정에서의 위상정렬:
각 과목은 노드로, 수학1 → 수학2처럼 선행 관계는 간선으로 나타낼 수 있어요.
이 그래프에서 위상정렬을 하면, 수학1을 먼저 듣고, 그 후에 수학2를 듣고, 수학3을 듣는 순서를 찾을 수 있게 됩니다.
뭔지 대충 느낌을 이해했을거라 생각한다.
from collections import deque
def topological_sort(graph):
indegree = {node: 0 for node in graph}
for node in graph:
for neighbor in graph[node]:
indegree[neighbor] += 1
queue = deque([node for node in graph if indegree[node] == 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
graph = {
'A': ['B', 'C'],
'B': ['D'],
'C': ['D'],
'D': []
}
print(topological_sort(graph))