[Python] 위상정렬 (Kahn 알고리즘, DFS 활용)

2025. 4. 3. 20:52·Algorithm

정의

위상정렬은 무순환 방향 그래프 DAG(Directed Acyclie Graph)에서 정돈되지 않은 그래프를, 각 노드의 선후관계를 정립해 일관된 방향으로 향하도록 정렬하는 방식이다. (작업의 우선순위, 부품의 조립 순서)

Kahn 알고리즘(BFS 기반)

각 노드의 진입차수(indegree) 계산 후, 진입 차수가 0인 노드를 큐에 넣고, 연결된 노드의 진입 차수를 감소

최종적으로 현재 진입 차수가 0인 노드를 선택

from collections import deque

def topological_sort_kahn(graph, indegree):
    result = []              # 위상 정렬 결과 저장
    queue = deque([i for i in range(1, len(indegree)) if indegree[i] == 0])

    while queue:
        node = queue.popleft()
        result.append(node)
        for neighbor in graph[node]:
            indegree[neighbor] -= 1
            if indegree[neighbor] == 0:
                queue.append(neighbor)

    if len(result) != len(graph) - 1:  # 그래프에 사이클이 있는 경우
        return None
    return result

# 사용 예제:
n = 6
graph = {1: [2, 3],
         2: [4],
         3: [4, 5],
         4: [6],
         5: [6],
         6: []}
indegree = [0] * (n+1)
for u in graph:
    for v in graph[u]:
        indegree[v] += 1

print(topological_sort_kahn(graph, indegree))

DFS 위상정렬

DFS(깊이 우선 탐색)를 통해 각 노드에 대해 탐색을 진행하고,
재귀 호출이 끝난 후(백트래킹 시점)에 노드를 결과 리스트에 추가.
최종적으로 리스트를 역순으로 뒤집으면 위상 정렬 결과가 됨

def topological_sort_dfs(graph):
    visited = [False] * (len(graph) + 1)
    result = []

    def dfs(node):
        visited[node] = True
        for neighbor in graph[node]:
            if not visited[neighbor]:
                dfs(neighbor)
        result.append(node)

    for node in range(1, len(graph)):
        if not visited[node]:
            dfs(node)

    result.reverse()  # 역순으로 뒤집어 위상 정렬 결과 얻기
    return result

# 사용 예제:
graph = {1: [2, 3],
         2: [4],
         3: [4, 5],
         4: [6],
         5: [6],
         6: []}
print(topological_sort_dfs(graph))
728x90

'Algorithm' 카테고리의 다른 글

동적 프로그래밍(Dynamic Programing)  (0) 2025.08.04
[Python] 너비 우선 탐색(BFS)와 깊이 우선 탐색(DFS)  (0) 2025.04.03
[Python] 다익스트라(Dijkstra) 알고리즘 (최단경로 탐색)  (0) 2025.04.03
[Python] 트리 - 전위, 중위, 후위순회와 이진탐색트리  (0) 2025.04.03
[Python] 백준 3190 - 뱀 (deque와 list를 활용한 queue 구현)  (0) 2025.03.25
'Algorithm' 카테고리의 다른 글
  • 동적 프로그래밍(Dynamic Programing)
  • [Python] 너비 우선 탐색(BFS)와 깊이 우선 탐색(DFS)
  • [Python] 다익스트라(Dijkstra) 알고리즘 (최단경로 탐색)
  • [Python] 트리 - 전위, 중위, 후위순회와 이진탐색트리
ahpicl64
ahpicl64
in the clouds
  • ahpicl64
    구름
    ahpicl64
  • 전체
    오늘
    어제
    • 분류 전체보기 (95)
      • WIL (4)
      • Jungle (36)
      • AWS (2)
      • SQL (2)
      • CS:APP (17)
      • Algorithm (10)
      • K8s (7)
      • 자료 구조 (10)
      • Spring (4)
      • React (0)
      • 운영체제 (1)
      • 기타등등 (2)
      • 이야기 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    알고리즘
    Spring boot
    python
    queue
    DB
    EC2
    k8s
    Spring
    자료구조
    github actions
    IAM
    부하테스트
    S3
    트러블슈팅
    컴퓨터시스템
    AWS
    DevOps
    어셈블리
    CSAPP
    CloudFront
  • 02-21 15:43
  • hELLO· Designed By정상우.v4.10.3
ahpicl64
[Python] 위상정렬 (Kahn 알고리즘, DFS 활용)
상단으로

티스토리툴바