[python] 위상 정렬

위상 정렬은 방향 그래프의 노드들을 임의의 순서로 나열하는 알고리즘입니다. 이 알고리즘은 어떤 일련의 작업을 수행하는 순서를 결정할 때 많이 사용됩니다.

알고리즘 개요

  1. 진입 차수가 0인 모든 노드를 큐에 넣습니다.
  2. 큐에서 노드를 하나씩 꺼내고 해당 노드와 연결된 간선을 삭제합니다.
  3. 간선 삭제 후 진입 차수가 0이 된 노드를 큐에 넣습니다.
  4. 큐가 빌 때까지 반복합니다.

예시 코드

from collections import deque

def topological_sort(graph):
    result = []
    indegree = [0] * len(graph)

    for nodes in graph.values():
        for node in nodes:
            indegree[node] += 1

    queue = deque()

    for i in range(len(indegree)):
        if indegree[i] == 0:
            queue.append(i)

    while queue:
        node = queue.popleft()
        result.append(node)

        for connected_node in graph[node]:
            indegree[connected_node] -= 1
            if indegree[connected_node] == 0:
                queue.append(connected_node)

    return result

예시 그래프

graph = {
    0: [],
    1: [2, 5],
    2: [3, 4],
    3: [],
    4: [],
    5: []
}

result = topological_sort(graph)
print(result)  # Output: [0, 1, 2, 5, 4, 3]

시간 복잡도

위상 정렬의 시간 복잡도는 O(V + E)입니다. V는 노드의 수, E는 간선의 수입니다.

마무리

위상 정렬은 작업의 선후 관계를 파악하여 순서를 결정할 때 유용한 알고리즘입니다. Python을 사용하여 위상 정렬을 쉽게 구현할 수 있습니다. 위상 정렬은 다양한 문제에서 응용될 수 있으므로, 알고리즘 개념을 익혀 활용해보세요.

참고 자료: