// education

16. 위상 정렬(Topological Sort)과 방향 비순환 그래프(DAG) - 진입 차수와 Kahn 알고리즘

사이클이 없는 방향 그래프(DAG)에서 정점들을 선후 관계 순서에 맞추어 일렬로 정렬하는 **위상 정렬(Topological Sort)**을 다룹니다.


4. 실전 파이썬(Python 3) 알고리즘 구현 코드 및 라인별 주석 해설

본 레슨의 핵심 연산 매커니즘을 파이썬 3 환경에서 가장 효율적이고 직관적으로 구현한 실전 소스 코드입니다. 모든 주요 라인마다 상세한 한글 주석이 기재되어 있어 코드의 흐름을 쉽고 명확하게 이해할 수 있습니다.

from collections import deque

def topological_sort(v: int, edges: list) -> list:
    """Kahn 큐 기반 위상 정렬 알고리즘"""
    indegree = [0] * (v + 1)  # 진입 차수 배열
    graph = [[] for _ in range(v + 1)]  # 인접 리스트
    
    for u, dest in edges:
        graph[u].append(dest)
        indegree[dest] += 1  # 진입 차수 증가
        
    # 진입 차수가 0인 노드들을 큐에 초기 삽입
    queue = deque([i for i in range(1, v + 1) if indegree[i] == 0])
    result = []
    
    while queue:
        curr = queue.popleft()
        result.append(curr)
        
        # 현재 노드와 연결된 인접 노드들의 진입 차수 감축
        for nxt in graph[curr]:
            indegree[nxt] -= 1
            # 새롭게 진입 차수가 0이 된 노드를 큐에 삽입
            if indegree[nxt] == 0:
                queue.append(nxt)
                
    # 결과 원소 수가 전체 정점 수와 다르면 그래프 내 사이클 존재!
    return result if len(result) == v else []

if __name__ == "__main__":
    edges = [(1, 2), (1, 5), (2, 3), (3, 4), (4, 6), (5, 6), (6, 7)]
    print("위상 정렬 작업 수행 순서:", topological_sort(7, edges))

파이썬 소스 코드 핵심 포인트 해설

  1. indegree: 진입 차수가 0인 노드를 큐에 삽입하고 간선을 제거해 나가며 순서를 배치합니다.

5. 알고리즘 설계 및 최적화 실무 지침 (Best Practices & Complexity Audit)

16. 위상 정렬(Topological Sort)과 방향 비순환 그래프(DAG) - 진입 차수와 Kahn 알고리즘 레슨에서 익힌 핵심 알고리즘 메커니즘을 코딩 테스트 및 대규모 웹/서버 엔지니어링 환경에 도입할 때 반드시 체크해야 하는 튜닝 가이드입니다.

1) 공간/시간 복잡도 한계 및 메모리 사용 제어

2) 예외 케이스(Edge Cases) 및 코딩 테스트 체크리스트

  1. 입력 경계값 검증: $N=1$ 이거나 $N=0$ 인 극단적 최소 입력, 혹은 모든 요소의 값이 동일한 경우(Corner Case)에 대한 예외 처리를 누락하지 않습니다.
  2. 무한 루프 및 사이클 감지: 그래프/트리 탐색 시 방문 처리 배열(visited[])의 업데이트 위치를 정확히 지정하여 중복 큐 삽입으로 인한 메모리 초과를 예방합니다.

6. 핵심 요약 및 실무 FAQ (Summary & Q&A)

Q1. 파이썬 코드 주석에서 강조된 성능 핵심은 무엇인가요?

Q2. 실무 개발에서 본 파이썬 알고리즘 패턴은 어디에 활용되나요?

← 이전15. 최소 신장 트리(MST) - 크루스칼(Kruskal: Union-Find)과 프림(Prim: Priority Queue) 다음 →17. 문자열 검색 알고리즘 - KMP(Knuth-Morris-Pratt $O(N+M)$)와 라빈-카프(Rabin-Karp)