Swift Data Structure And Algorithm/Graph Algorithm

๋ฏธ๋กœ ์ฐพ๊ธฐ

youngjaeLee1026 2022. 4. 15. 13:18

1. ๋ฌธ์ œ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-04-15 13 06 12

2. ์ž…์ถœ๋ ฅ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-04-15 13 06 21

3. ์ž…์ถœ๋ ฅ ์˜ˆ์‹œ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-04-15 13 06 31

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

  • ๊ฐ€์ค‘์น˜๊ฐ€ ์—†๋Š” ๊ทธ๋ž˜ํ”„์—์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ ์ ˆํ•จ
  • DFS๋„ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ์„ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ๊นŠ์ด์šฐ์„ ํƒ์ƒ‰์€ ๊ณ„์† ํ•ด์„œ ๋‚ฎ์€ ๋ ˆ๋ฒจ๋กœ ํƒ์ƒ‰ํ•˜๋ฏ€๋กœ ์ ์ ˆํ•˜์ง€ ์•Š์Œ
  • ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ๋ฐฉ๋ฌธํ•˜๋Š” ๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰์œผ๋กœ ๋ฐฉ๋ฌธํ•  ๋•Œ๋งˆ๋‹ค ๊ฑฐ๋ฆฌ๋ฅผ ์ด์ „ ๋…ธ๋“œ์˜ ๊ฑฐ๋ฆฌ์— + 1 ์”ฉ ๋ˆ„์ ์‹œํ‚ค๊ณ ,
  • ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ชฉ์ ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅํ•จ์œผ๋กœ์จ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ

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

//MARK: - ๋ฏธ๋กœ ์ฐพ๊ธฐ

//MARK: - Framework
import Foundation

//MARK: - Type
struct Node {
    //MARK: - Property
    var x, y: Int
    
    //MARK: - Initializer
    init(_ x: Int, _ y: Int) {
        self.x = x
        self.y = y
    }
}

//MARK: - Variable
var N: Int = 0
var M: Int = 0
var graph: [[Int]] = []
var visited: [[Bool]] = []
var distances: [[Int]] = []
var dx: [Int] = [0, 0, -1, 1]
var dy: [Int] = [-1, 1, 0, 0]

//MARK: - Function
func bfs(_ x: Int, _ y: Int) -> Int {
    var queue: [Node] = []
    queue.append(Node(x, y))
    visited[x][y] = true
    
    while !queue.isEmpty {
        let currentNode: Node = queue.removeFirst()
        
        for i in 0..<4 {
            let nx: Int = currentNode.x + dx[i]
            let ny: Int = currentNode.y + dy[i]
            
            if !visited[nx][ny] && graph[nx][ny] == 0 {
                visited[nx][ny] = true
                queue.append(Node(nx, ny))
                distances[nx][ny] = distances[currentNode.x][currentNode.y] + 1
            }
        }
    }
    
    return distances[1][M]
}

func solution() -> Void {
    //MARK: - Input
    guard let input: [String] = readLine()?.components(separatedBy: " ") else { return }
    var result: Int = 0
    N = input.map { Int($0) }[0] ?? 0
    M = input.map { Int($0) }[1] ?? 0
    graph = Array(repeating: Array(repeating: 1, count: M + 10), count: N + 10)
    visited = Array(repeating: Array(repeating: false, count: M + 10), count: N + 10)
    distances = Array(repeating: Array(repeating: 0, count: M + 10), count: N + 10)
    
    for i in 1...N {
        guard let inputData: [String] = readLine()?.components(separatedBy: " ") else { return }
        let data: [Int] = inputData.map { Int($0) ?? 0 }
        
        for j in 1...M {
            graph[i][j] = data[j - 1]
        }
    }
    
    //MARK: - Process
    result = bfs(N, 1)
    
    //MARK: - Output
    print(result)
}
solution()

 

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