스위프트 코딩테스트 강좌, 다익스트라

오늘은 스위프트에서 다익스트라 알고리즘을 사용하여 최단 경로를 찾는 문제를 해결해 보겠습니다. 다익스트라 알고리즘은 그래프 이론에서 가장 중요한 알고리즘 중 하나로, 특정 노드에서 다른 모든 노드까지의 최단 경로를 찾는 데 사용됩니다.

알고리즘 소개

다익스트라 정리(Dijkstra’s Algorithm)는 1956년에 컴퓨터 과학자 에드가 다익스트라(Edgar Dijkstra)에 의해 개발된 그래프 검색 알고리즘입니다. 이 알고리즘은 음의 가중치가 없는 그래프에서 최단 경로를 찾는 데 효과적입니다.

작동 원리

알고리즘은 다음과 같은 단계로 진행됩니다:

  1. 시작 노드를 선택하고, 이 노드의 거리를 0으로 설정합니다.
  2. 이웃 노드에 대한 거리를 업데이트합니다.
  3. 모든 노드의 거리를 계산한 후, 가장 가까운 노드를 선택하여 다음 노드로 이동합니다.
  4. 이 과정을 모든 노드의 최단 거리를 찾을 때까지 반복합니다.

문제 예시

다음은 다익스트라 알고리즘을 사용하여 해결할 수 있는 문제입니다:

문제: 최단 경로 찾기

주어진 그래프에서 특정 출발 노드에서 다른 노드로의 최단 경로를 구하시오. 아래는 그래프의 가중치가 있는 인접 리스트입니다:

0: {1: 4, 2: 1}
1: {2: 2, 3: 5}
2: {1: 1, 3: 8}
3: {}

위 그래프에서, 0번 노드에서 3번 노드까지의 최단 경로를 구하는 프로그램을 작성합니다. 결과적으로 0 -> 2 -> 1 -> 3으로 최단 경로를 찾을 수 있어야 합니다.

스위프트 구현

이제 실제로 위 문제를 해결하기 위해 스위프트로 다익스트라 알고리즘을 구현해 보겠습니다.


import Foundation

// 그래프를 나타내기 위한 클래스
class Graph {
    var vertices: Int
    var adjList: [[(node: Int, weight: Int)]]
    
    init(vertices: Int) {
        self.vertices = vertices
        self.adjList = Array(repeating: [], count: vertices)
    }

    func addEdge(source: Int, destination: Int, weight: Int) {
        adjList[source].append((node: destination, weight: weight))
    }

    func dijkstra(source: Int) -> [Int] {
        var distances = Array(repeating: Int.max, count: vertices)
        var visited = Array(repeating: false, count: vertices)
        distances[source] = 0

        for _ in 0.. Int {
        var min = Int.max
        var minIndex = -1
        
        for v in 0.. 1: 4, 0 -> 2: 1, 1 -> 3: 9

위의 코드에서, 그래프 클래스는 인접 리스트를 사용하여 노드 간의 관계를 저장하고, 다익스트라 알고리즘을 통해 최단 경로를 계산합니다. 주어진 예제를 통해 노드 0에서 노드 3까지의 최단 경로를 출력합니다.

결론

다익스트라 알고리즘은 최단 경로 문제를 해결하는 데 매우 유용한 도구입니다. 스위프트를 사용하여 이를 구현함으로써 알고리즘의 작동 방식을 이해하고, 실제 프로그래밍 연습을 통해 중요한 코딩 기술을 향상시킬 수 있습니다. 여러분도 다익스트라 알고리즘을 활용하여 다양한 그래프 문제를 해결해 보시기 바랍니다.

더 많은 알고리즘 문제와 해결 방법에 대해 알아보고 싶다면, 저의 블로그를 계속 팔로우해 주세요!