on my way

Python 코딩테스트 08: 다익스트라 알고리즘 본문

algorithm/CodingTest

Python 코딩테스트 08: 다익스트라 알고리즘

wingbeat 2024. 7. 29. 21:36
반응형

다익스트라 알고리즘(Dijkstra's Algorithm) 이해하기

다익스트라 알고리즘은 그래프 이론에서 가장 널리 사용되는 알고리즘 중 하나로, 단일 출발점에서 모든 다른 노드까지의 최단 경로를 찾는 알고리즘입니다.

이 포스팅에서는 다익스트라 알고리즘의 원리, 작동 방식, 그리고 다양한 활용 사례와 함께 이를 실제 문제에 적용하는 방법을 자세히 설명하겠습니다.

 

다익스트라 알고리즘의 개념

다익스트라 알고리즘은 네덜란드의 컴퓨터 과학자 에츠허르 다익스트라(Edsger Dijkstra)가 1956년에 고안한 알고리즘입니다.

이 알고리즘은 가중치가 있는 그래프에서 최단 경로를 찾는 데 사용됩니다.

다익스트라 알고리즘은 다음과 같은 특징을 가지고 있습니다:

  1. 단일 출발점 최단 경로(Single-Source Shortest Path): 주어진 출발점에서 다른 모든 노드까지의 최단 경로를 구합니다.
  2. 비음수 가중치(Non-negative Weights): 간선의 가중치가 음수가 아닌 경우에만 적용됩니다.
  3. 탐욕적 접근(Greedy Approach): 매 단계에서 가장 최단 거리를 갖는 노드를 선택하여 경로를 확장합니다.

 

다익스트라 알고리즘의 원리

다익스트라 알고리즘은 다음과 같은 단계로 작동합니다:

  1. 초기화: 출발 노드의 거리를 0으로 설정하고, 다른 모든 노드의 거리를 무한대로 설정합니다.
  2. 방문하지 않은 노드 중 최단 거리를 가진 노드 선택: 현재 노드에서 인접한 모든 노드의 거리를 업데이트합니다.
  3. 거리를 업데이트: 현재 노드와 인접한 노드 간의 거리를 계산하여 더 짧은 경로가 발견되면 거리를 업데이트합니다.
  4. 반복: 모든 노드를 방문할 때까지 2번과 3번 단계를 반복합니다.

 

다익스트라 알고리즘의 예시

 

 

다익스트라 알고리즘의 구현

다익스트라 알고리즘을 파이썬으로 구현하는 예시 코드를 보겠습니다.

이 코드는 우선순위 큐를 사용하여 효율적으로 동작합니다.

import heapq

def dijkstra(graph, start):
    # distances는 시작 노드에서 각 노드까지의 최단 거리를 저장하는 딕셔너리입니다.
    distances = {node: float('inf') for node in graph}
    # 시작 노드에서 자기 자신으로 가는 거리는 0으로 설정합니다.
    distances[start] = 0
    # 우선순위 큐를 생성합니다. 시작 노드부터 처리하므로 (0, start)를 추가합니다.
    priority_queue = [(0, start)]

    while priority_queue:
        # 현재 가장 가까운 노드를 우선순위 큐에서 꺼냅니다.
        current_distance, current_node = heapq.heappop(priority_queue)

        # 이미 처리된 노드라면 무시합니다.
        if current_distance > distances[current_node]:
            continue

        # 현재 노드의 모든 이웃 노드를 확인합니다.
        for neighbor, weight in graph[current_node].items():
            # 현재 노드를 거쳐서 이웃 노드로 가는 거리입니다.
            distance = current_distance + weight

            # 이 거리(distance)가 기존에 저장된 거리보다 짧다면, 업데이트합니다.
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                # 이웃 노드를 우선순위 큐에 추가합니다.
                heapq.heappush(priority_queue, (distance, neighbor))

    return distances

# 예시 그래프
graph = {
    'A': {'B': 1, 'C': 2},
    'B': {'A': 1, 'E': 2, 'D': 6},
    'C': {'A': 2, 'E': 3, 'F': 8},
    'D': {'B': 6, 'E': 1},
    'E': {'B': 2, 'C': 3, 'D': 1, 'F': 7},
    'F': {'C': 8, 'E': 7}
}

print(dijkstra(graph, 'A'))

코드 설명

  1. 우선순위 큐 초기화: heapq 모듈을 사용하여 우선순위 큐를 초기화합니다. 우선순위 큐는 다익스트라 알고리즘에서 최단 경로를 찾는 데 효율적으로 사용할 수 있습니다.
  2. 거리 초기화: distances 딕셔너리를 생성하여 각 노드까지의 거리를 무한대(float('inf'))로 초기화합니다. 시작 노드까지의 거리는 0으로 설정합니다.
  3. 우선순위 큐에 시작 노드 추가: (0, start)를 우선순위 큐에 추가합니다. 여기서 0은 시작 노드까지의 거리입니다.
  4. 우선순위 큐 처리:
    • 큐에서 가장 가까운 노드를 꺼냅니다 (current_distance, current_node).
    • 꺼낸 노드의 거리가 이미 처리된 거리보다 크다면 무시합니다.
    • 꺼낸 노드의 모든 이웃 노드를 확인합니다.
    • 현재 노드를 거쳐 이웃 노드로 가는 거리(distance)를 계산합니다.
    • 이 거리가 기존에 저장된 거리보다 짧다면, distances 딕셔너리를 업데이트합니다.
    • 업데이트된 이웃 노드를 우선순위 큐에 추가합니다.
  5. 최단 거리 반환: 모든 노드를 처리한 후 시작 노드에서 각 노드까지의 최단 거리를 저장한 distances 딕셔너리를 반환합니다.

예시 그래프 설명

  • graph는 각 노드와 그 이웃 노드 간의 거리를 나타냅니다.
  • 예를 들어, 노드 'A'는 노드 'B'와 거리 1로, 노드 'C'와 거리 2로 연결되어 있습니다.

실행 결과

코드를 실행하면 시작 노드 'A'에서 각 노드까지의 최단 거리를 출력합니다.

이 예시에서는 다음과 같은 결과를 얻을 수 있습니다:

{'A': 0, 'B': 1, 'C': 2, 'E': 3, 'D': 4, 'F': 10}

 

이 결과는 시작 노드 'A'에서 각 노드까지의 최단 거리를 나타냅니다.

예를 들어, 'A'에서 'B'까지의 최단 거리는 1이고, 'A'에서 'E'까지의 최단 거리는 3입니다.

 

다익스트라 알고리즘의 활용

최단 경로 문제

다익스트라 알고리즘은 다양한 최단 경로 문제에서 활용될 수 있습니다. 예를 들어, 지도 어플리케이션에서 출발지에서 목적지까지의 최단 경로를 찾는 문제나 네트워크에서 패킷 전송 경로를 최적화하는 문제 등에서 사용됩니다.

네트워크 라우팅

네트워크 라우팅에서는 데이터 패킷이 네트워크를 통해 효율적으로 전달되도록 경로를 설정해야 합니다. 다익스트라 알고리즘은 이 과정에서 최적의 경로를 찾는 데 유용하게 사용됩니다.

교통 최적화

교통 시스템에서 차량의 이동 경로를 최적화하기 위해 다익스트라 알고리즘을 사용할 수 있습니다. 교통 흐름을 분석하여 최적의 경로를 찾고 혼잡을 최소화하는 데 도움을 줍니다.

결론

다익스트라 알고리즘은 단일 출발점에서 모든 다른 노드까지의 최단 경로를 찾는 강력한 도구입니다.

탐욕적 접근을 통해 효율적으로 문제를 해결할 수 있으며, 다양한 실생활 문제에 적용될 수 있습니다.

다익스트라 알고리즘을 잘 이해하고 활용하면 그래프 이론 문제를 효과적으로 해결할 수 있습니다.

각 단계와 원리를 명확히 이해하고 다양한 문제에 적용해 보세요!

반응형