// education

14. 모든 쌍 최단 경로 알고리즘 - 플로이드-워셜(Floyd-Warshall $O(V^3)$)과 경유지 DP

모든 정점 쌍 간의 최단 거리를 동적 계획법(DP)으로 구하는 플로이드-워셜(Floyd-Warshall) 알고리즘을 학습합니다.


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

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

def floyd_warshall(n: int, edges: list) -> list:
    """모든 정점 쌍 간의 최단 경로 플로이드-워셜 O(V^3)"""
    INF = float('inf')
    # 2차원 최단 거리 테이블 초기화
    dist = [[INF] * (n + 1) for _ in range(n + 1)]
    
    # 자기 자신으로 가는 거리는 0 설정
    for i in range(1, n + 1):
        dist[i][i] = 0
        
    # 간선 가중치 정보 반영
    for u, v, w in edges:
        dist[u][v] = w
        
    # 3중 루프: [경유지 k] -> [출발지 i] -> [도착지 j]
    for k in range(1, n + 1):
        for i in range(1, n + 1):
            for j in range(1, n + 1):
                # 점화식: dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
                dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
    return dist

if __name__ == "__main__":
    edges = [(1, 2, 4), (1, 4, 6), (2, 1, 3), (2, 3, 7), (3, 1, 5), (3, 4, 4), (4, 3, 2)]
    matrix = floyd_warshall(4, edges)
    print("모든 쌍 최단 경로 (노드 1 -> 노드 3):", matrix[1][3])

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

  1. dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]): 경유지 $k$를 가장 바깥쪽 루프에 두어야 정확한 최단 경로 DP 갱신이 보장됩니다.

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

14. 모든 쌍 최단 경로 알고리즘 - 플로이드-워셜(Floyd-Warshall $O(V^3)$)과 경유지 DP 레슨에서 익힌 핵심 알고리즘 메커니즘을 코딩 테스트 및 대규모 웹/서버 엔지니어링 환경에 도입할 때 반드시 체크해야 하는 튜닝 가이드입니다.

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

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

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

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

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

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

← 이전13. 단일 출발지 최단 경로 알고리즘 - 다익스트라(Dijkstra)와 벨만-포드(Bellman-Ford) 다음 →15. 최소 신장 트리(MST) - 크루스칼(Kruskal: Union-Find)과 프림(Prim: Priority Queue)