Swift Data Structure And Algorithm/Graph Algorithm

์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜(Dijkstra's Algorithm)

youngjaeLee1026 2022. 4. 16. 16:53

1. ๋ฌธ์ œ

  • ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ทธ๋ž˜ํ”„์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„

2. ๋ฌธ์ œ ์„ค๊ณ„

  • ์ฒ˜์Œ ๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ํฐ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•˜๊ณ ,
  • ์‹œ์ž‘์ ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ ๊ฐ’์„ 0์œผ๋กœ ์‹œ์ž‘ํ•˜๊ณ , ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ ํ›„ ์‹œ์ž‘์ ์œผ๋กœ๋ถ€ํ„ฐ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ ๊ฐ’๊ณผ ์ธ์ ‘ํ•œ ์ •์ ๋“ค์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ์˜ ํ•ฉ ์ค‘ ๋” ์ž‘์€ ๊ฐ’์œผ๋กœ ์ €์žฅ
  • ์ดํ›„ ๋‹ค์‹œ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ •์ ์— ๋Œ€ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ ๊ฐ’์˜ ์ตœ์†Œ๊ฐ’์„ ์ฐพ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•จ
  • ์œ„ ๊ณผ์ •์„ ๋ชจ๋“  ์ •์ ์— ๋Œ€ํ•ด ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋˜๋ฉด ์‹œ์ž‘์ ์œผ๋กœ๋ถ€ํ„ฐ ๋ชจ๋“  ์ •์ ์— ๋Œ€ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์Œ

3. ์ „์ฒด ์ฝ”๋“œ

//MARK: - ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

//MARK: - Framework
import Foundation

//MARK: - Type
struct Graph {
    //MARK: - Property
    var edges: [Int]
    var costs: [Int]
    
    //MARK: - Initializer
    init() {
        self.edges = []
        self.costs = []
    }
}

//MARK: - Variable
var graph: [Graph] = []
var visited: [Bool] = []

//MARK: - Function
func dijkstra(_ N: Int, _ start: Int, _ end: Int) -> Int {
    var distances: [Int] = Array(repeating: 987987987, count: N + 10)
    distances[start] = 0
    
    for _ in 0..<N {
        var minCost, minIndex: Int
        minCost = 987987987
        minIndex = -1
        
        for j in 0..<N {
            if !visited[j] && minCost > distances[j] {
                minCost = distances[j]
                minIndex = j
            }
        }
        visited[minIndex] = true
        
        for j in 0..<graph[minIndex].edges.count {
            let y: Int = graph[minIndex].edges[j]
            let cost: Int = graph[minIndex].costs[j]
            
            if distances[y] > distances[minIndex] + cost {
                distances[y] = distances[minIndex] + cost
            }
        }
    }
    
    return distances[end]
}

func solution() -> Void {
    //MARK: - Input
    guard let input: [String] = readLine()?.components(separatedBy: " ") else { return }
    let N: Int = input.map { Int($0) }[0] ?? 0
    let M: Int = input.map { Int($0) }[1] ?? 0
    let start: Int = input.map { Int($0) }[2] ?? 0
    let end: Int = input.map { Int($0) }[3] ?? 0
    var result: Int = 0
    
    graph = Array(repeating: Graph(), count: N + 10)
    visited = Array(repeating: false, count: N + 10)
    
    for _ in 0..<M {
        guard let inputData: [String] = readLine()?.components(separatedBy: " ") else { return }
        let a: Int = inputData.map { Int($0) }[0] ?? 0
        let b: Int = inputData.map { Int($0) }[1] ?? 0
        let c: Int = inputData.map { Int($0) }[2] ?? 0
        
        graph[a].edges.append(b)
        graph[b].edges.append(a)
        graph[a].costs.append(c)
        graph[b].costs.append(c)
    }
    
    //MARK: - Process
    result = dijkstra(N, start, end)
    
    //MARK: - Output
    print(result)
}
solution()

 

์ „์ฒด์ฝ”๋“œ๋Š” ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.