DSData StructuresPython learning path
0 / 12 완료
LESSON 12

위상 정렬

선행 조건을 지키면서 모든 작업의 실행 순서를 만드는 알고리즘

왜 위상 정렬을 쓸까요?

작업 A가 끝나야 B를 시작할 수 있는 의존 관계에서 가능한 전체 순서를 찾습니다. 빌드, 수강 과목, 데이터 파이프라인처럼 방향성과 선후 관계가 핵심인 문제에 맞습니다.

LIFE EXAMPLE

생활 속에서 먼저 이해해 볼까요?

코드를 생각하지 말고, 아래 상황이 어떤 순서로 움직이는지만 따라가 보세요.

현실 예시 1

라면 끓이기

물을 끓이기 전에 면을 익힐 수 없고, 면을 익힌 다음에야 그릇에 담을 수 있습니다.

자료구조와 연결하면먼저 끝나야 하는 단계의 순서를 지켜 전체 작업 순서를 만듭니다.
현실 예시 2

아침에 옷 입기

양말을 신은 뒤 신발을 신고, 셔츠를 입은 뒤 재킷을 입어야 합니다. 서로 관계없는 일은 순서가 바뀌어도 됩니다.

자료구조와 연결하면선행 조건은 지키되 가능한 실행 순서는 여러 개일 수 있습니다.

실무에서는 이렇게 씁니다

코딩 테스트의 장난감 예제를 넘어, 실제 시스템에서 같은 원리가 어디에 숨어 있는지 연결해 보세요.

01

빌드 시스템

의존 라이브러리를 먼저 빌드한 뒤 애플리케이션을 빌드합니다.

02

워크플로 엔진

입력 데이터가 준비된 작업부터 실행합니다.

03

패키지 설치

의존 패키지를 올바른 순서로 설치하고 순환 의존을 탐지합니다.

04

DB 마이그레이션

선행 스키마 변경을 먼저 적용한 뒤 의존하는 변경을 실행합니다.

05

CI 파이프라인

테스트를 통과한 뒤 빌드하고, 빌드가 끝난 뒤 배포하도록 순서를 정합니다.

어떤 원리로 동작하나요?

방향 비순환 그래프(DAG)에서만 가능합니다. Kahn 알고리즘은 진입 차수가 0인 정점을 큐에 넣고, 꺼낼 때마다 나가는 간선을 제거합니다. 모든 정점을 처리하지 못했다면 사이클이 있습니다.

핵심 연산과 비용

연산Python 표현시간
진입 차수 계산indegreeO(V+E)
0차수 큐 구성dequeO(V)
간선 제거indegree[next] -= 1O(E)
사이클 판별결과 길이 < VO(1)
STEP BY STEP

A→C, B→C, C→D

  1. 1
    진입 차수A=0, B=0, C=2, D=1
  2. 2
    A, B 처리C의 차수 2→1→0
  3. 3
    C 처리D의 차수 1→0
  4. 4
    완료가능한 순서 A, B, C, D

⚠ 자주 하는 실수

  • 양방향 그래프에는 위상 정렬의 선행 관계가 정의되지 않습니다.
  • 결과의 길이를 확인하지 않으면 사이클을 놓칩니다.
  • 가능한 순서는 여러 개일 수 있습니다. 사전순 최소가 필요하면 deque 대신 heap을 씁니다.