특정 출발 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 다익스트라(Dijkstra) 알고리즘과 벨만-포드(Bellman-Ford) 알고리즘을 학습합니다.
4. 실전 파이썬(Python 3) 알고리즘 구현 코드 및 라인별 주석 해설
본 레슨의 핵심 연산 매커니즘을 파이썬 3 환경에서 가장 효율적이고 직관적으로 구현한 실전 소스 코드입니다. 모든 주요 라인마다 상세한 한글 주석이 기재되어 있어 코드의 흐름을 쉽고 명확하게 이해할 수 있습니다.
import heapq
def dijkstra(graph: dict, start: int) -> dict:
"""우선순위 큐 힙(heapq) 기반 다익스트라 O((E+V) log V) 최단 경로"""
# 1. 모든 노드의 최단 거리를 무한대(inf)로 초기화
distances = {node: float('inf') for node in graph}
distances[start] = 0
# 2. 우선순위 큐 (누적거리, 노드)
pq = [(0, start)]
while pq:
current_dist, current_node = heapq.heappop(pq)
# 이미 처리된 노드의 거리보다 더 긴 경로는 무시 (가지치기)
if current_dist > distances[current_node]:
continue
# 인접 노드 탐색 및 최단 거리 테이블 갱신
for neighbor, weight in graph[current_node]:
distance = current_dist + weight
if distance < distances[neighbor]:
distances[neighbor] = distance
heapq.heappush(pq, (distance, neighbor)) # 힙에 추가
return distances
if __name__ == "__main__":
graph = {
1: [(2, 2), (3, 5), (4, 1)],
2: [(3, 3), (4, 2)],
3: [(4, 3), (5, 1)],
4: [(5, 1)],
5: []
}
print("1번 노드 출발 각 노드별 최단 거리:", dijkstra(graph, 1))
파이썬 소스 코드 핵심 포인트 해설
heapq.heappush / heappop: 우선순위 큐 힙을 활용하여 $O((E+V) log V)$ 시간에 다익스트라 알고리즘을 수행합니다.
5. 알고리즘 설계 및 최적화 실무 지침 (Best Practices & Complexity Audit)
본 13. 단일 출발지 최단 경로 알고리즘 - 다익스트라(Dijkstra)와 벨만-포드(Bellman-Ford) 레슨에서 익힌 핵심 알고리즘 메커니즘을 코딩 테스트 및 대규모 웹/서버 엔지니어링 환경에 도입할 때 반드시 체크해야 하는 튜닝 가이드입니다.
1) 공간/시간 복잡도 한계 및 메모리 사용 제어
- 콜 스택 오버플로우(Stack Overflow) 예방: 파이썬의 기본 재귀 깊이 제한은 1,000회입니다. 재귀 탐색이 깊어질 경우
import sys; sys.setrecursionlimit(10**6)을 설정하거나 명시적 스택/반복문(Tabulation)으로 전환해야 합니다. - 파이썬 내장 라이브러리 적극 활용: 파이썬 내장 C-API 기반 라이브러리인
collections.deque(선형 BFS),heapq(다익스트라/우선순위 큐),bisect(이분 탐색),functools.lru_cache(Top-down DP)를 활용하면 직접 구현한 코드보다 3~5배 이상 빠르게 동작합니다. - 빠른 입출력(Fast I/O) 적용: 백준/프로그래머스 등 대용량 입력 문제에서는
import sys; input = sys.stdin.readline을 상단에 지정하여 I/O 시간 초과를 완벽히 예방합니다.
2) 예외 케이스(Edge Cases) 및 코딩 테스트 체크리스트
- 입력 경계값 검증: $N=1$ 이거나 $N=0$ 인 극단적 최소 입력, 혹은 모든 요소의 값이 동일한 경우(Corner Case)에 대한 예외 처리를 누락하지 않습니다.
- 무한 루프 및 사이클 감지: 그래프/트리 탐색 시 방문 처리 배열(
visited[])의 업데이트 위치를 정확히 지정하여 중복 큐 삽입으로 인한 메모리 초과를 예방합니다.
6. 핵심 요약 및 실무 FAQ (Summary & Q&A)
Q1. 파이썬 코드 주석에서 강조된 성능 핵심은 무엇인가요?
- 코드 주석에서 명시하듯, 선형 큐 탐색에는 $O(N)$의
list.pop(0)대신 $O(1)$의collections.deque.popleft()를 사용하는 등 파이썬 자료구조의 내부 복잡도를 명확히 파악하고 작성하는 것입니다.
Q2. 실무 개발에서 본 파이썬 알고리즘 패턴은 어디에 활용되나요?
- 백엔드 데이터 파이프라인, Django/FastAPI 비동기 스케줄링, 데이터 분석 및 Machine Learning 전처리 파이프라인의 핵심 데이터 구조 연산으로 널리 활용됩니다.