์ถœ์ฒ˜ : sun02๋‹˜ velog

import Foundation

/// 1: ์ด๋™๊ฐ€๋Šฅ, 0: ์ด๋™๋ถˆ๊ฐ€๋Šฅ
/// (1, 1)์—์„œ (N, M)์˜ ์œ„์น˜๋กœ ์ด๋™ํ•˜๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๊ตฌํ•ด๋ผ
/// dfs ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํŠน์„ฑ ์ƒ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ์œผ๋ ค๋ฉด ์™„์ „ ํƒ์ƒ‰์„ ํ•˜๊ณ  ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ์„ ํƒํ•ด์•ผ ํ•˜๋Š”๋ฐ
/// ๊ฒฝ๋กœ๊ฐ€ ์•„์ฃผ ๋งŽ์„ ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๋งค์šฐ ์ปค์ง„๋‹ค.
/// ๊ทธ๋ž˜์„œ bfs๋กœ ํ’€์–ด์•ผํ•œ๋‹ค.

let NM = readLine()!.components(separatedBy: " ").map { Int($0)! }

let N = NM[0]
let M = NM[1]

let dx = [0, 0, -1, 1]
let dy = [-1, 1, 0, 0]    // ์ƒํ•˜์ขŒ์šฐ

// 0๊ณผ 1์˜ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ๋ณด๋“œ
var board = [[Int]]()

// ๋ฐฉ๋ฌธํ•œ ์ขŒํ‘œ๋ฅผ ๋‹ด์„ ๋ฐฐ์—ด
var visited = [[Bool]](repeating: [Bool](repeating: false, count: M), count: N)

// ๊ฒฝ๋กœ๋ฅผ ๋‹ด์„ ๊ฑฐ๋ฆฌ๋ฅผ ๋‹ด์„ ๋ฐฐ์—ด
var distance = [[Int]](repeating: [Int](repeating: 0, count: M), count: N)

for _ in 0..<N {
    let nums = readLine()!.map { Int(String($0))! }
    board.append(nums)
}

func bfs() {
    distance[0][0] = 1
    visited[0][0] = true
    
    var queue: [[Int]] = [[0, 0]]
    
    while !queue.isEmpty {
        let pop = queue.removeFirst()
        
        let x = pop[0]
        let y = pop[1]
        
        // ์ขŒํ‘œ๋ฅผ ๋Œ๋ฉด์„œ ๊ฑฐ๋ฆฌ ๋”ํ•ด์ฃผ๊ธฐ
        for i in 0..<4 {
            let nx = x + dx[i]
            let ny = y + dy[i]
            
            if nx>=0, nx<N, ny>=0, ny<M {
                if !visited[nx][ny], board[nx][ny] == 1 {
                    distance[nx][ny] = distance[x][y] + 1
                    
                    visited[nx][ny] = true
                    queue.append([nx, ny])
                }
            }
        }
    }
}

bfs()
print(distance[N-1][M-1])
๋ฐ˜์‘ํ˜•
JerryiOS