๐Ÿ“ ์ฝ”ํ…Œ/BOJ

[Swift] ๋ฐฑ์ค€ 7569 ํ† ๋งˆํ† 

JerryiOS 2023. 6. 2. 01:15

import Foundation

let MNH = readLine()!.split(separator: " ").map { Int($0)! }

let M = MNH[0]   // ์—ด
let N = MNH[1]   // ํ–‰
let H = MNH[2]   // ๋ฉด

var board = [[[Int]]]()

for _ in 0..<H {
    var tmp = [[Int]]()
    for _ in 0..<N {
        let line = readLine()!.split(separator: " ").map{ Int($0)! }
        tmp.append(line)
    }
    board.append(tmp)
}

let dx = [-1, 1, 0, 0, 0, 0]
let dy = [0, 0, -1, 1, 0, 0]
let dz = [0, 0, 0, 0, -1, 1]

var queue = [(Int, Int, Int)]()
var dist = Array(repeating: Array(repeating: Array(repeating: -1, count: M), count: N), count: H)
var lastIdx = (0, 0, 0)
var idx = 0
var isCooked = true

for i in 0..<H {
    for j in 0..<N {
        for k in 0..<M {
            if board[i][j][k] == 1 {
                queue.append((i, j, k))
            }
        }
    }
}

while idx<queue.count {

    let cur = queue[idx]
    idx += 1

    for dir in 0..<6 {
        let nz = cur.0 + dz[dir]
        let ny = cur.1 + dy[dir]
        let nx = cur.2 + dx[dir]

        if nx<0 || ny<0 || nz<0 || nx>=M || ny>=N || nz>=H { continue }
        if board[nz][ny][nx] == 0 {
            board[nz][ny][nx] = 1
            queue.append((nz, ny, nx))
            // board[H][N][M] ์ˆœ์„œ
            dist[nz][ny][nx] = dist[cur.0][cur.1][cur.2] + 1
            lastIdx = (nz, ny, nx)
        }
    }
}

for i in 0..<H {
    for j in 0..<N {
        for k in 0..<M {
            if board[i][j][k] == 0 {
                isCooked = false
            }
        }
    }
}

if isCooked {
    print(dist[lastIdx.0][lastIdx.1][lastIdx.2]+1)
} else {
    print(-1)
}
[BFS] ์‹œ์ž‘์ ์ด ์—ฌ๋Ÿฌ๊ฐœ์ธ ์œ ํ˜• + 3์ฐจ์›๋ฐฐ์—ด

- board : 3์ฐจ์›๋ฐฐ์—ด์„ ๋‹ด์„ ๊ณต๊ฐ„
- dx, dy, dz : ๋ฐฉํ–ฅ์„ ์ •ํ•ด์ค€๋‹ค. (์ต์€ ํ† ๋งˆํ† ๋ฅผ ๊ฒฐ์ •ํ•  ๋ฐฉํ–ฅ์„ ์ฐพ๊ธฐ ์œ„ํ•ด)
- dist : ํ† ๋งˆํ† ๊ฐ€ ์ต์€ ์‹œ๊ฐ„์„ ๋‹ด์„ ๋ฐฐ์—ด์„ ์„ ์–ธํ•ด์ค€๋‹ค. (์ตœ์†Œ๊ฑฐ๋ฆฌ์™€ ๋น„์Šทํ•œ ๊ฐœ๋…)
- lastIdx : ๋งˆ์ง€๋ง‰ ์ขŒํ‘œ๋ฅผ ๋‹ด์„ ํŠœํ”Œ
- idx: ํ์˜ ํฌ์ธํ„ฐ ์ธ๋ฑ์Šค
- isCooked : ๋ชจ๋“  ํ† ๋งˆํ† ๊ฐ€ ์ต์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ Bool

1. 3์ฐจ์› ๋ฐฐ์—ด์„ ๋Œ๋ฉฐ ์ต์€ํ† ๋งˆํ† (1)๊ฐ€ ์žˆ๋Š” ์ขŒํ‘œ๋ฅผ ํ์— ๋„ฃ์–ด์ค€๋‹ค.
2. ํ์—์„œ idx๋ฅผ ์ด์šฉํ•ด ์ฒซ๋ฒˆ์งธ ์š”์†Œ๋ฅผ pop ํ•ด์ค€๋‹ค.
3. popํ•œ ์ขŒํ‘œ๋ฅผ 6๊ฐ€์ง€ ๋ฐฉํ–ฅ์œผ๋กœ bfs๋ฅผ ๋Œ๋ฆฐ๋‹ค. (์ด๋•Œ index ์ˆœ์„œ๋Š” z,y,x ์ˆœ์ด๋‹ค. ์ฒ˜์Œ์— ๊ทธ๋ ‡๊ฒŒ ๋‹ด์•„์„œ..)
4. ์ƒˆ๋กœ์šด ์ขŒํ‘œ์˜ ๊ฐ’์ด ์•ˆ์ต์€ํ† ๋งˆํ† (0)์ผ ๊ฒฝ์šฐ board์˜ ๊ฐ’์„ ์ต์€ํ† ๋งˆํ† (1)๋กœ ๋ฐ”๊พธ๊ณ , dist์— ์ต์€ ์‹œ๊ฐ„์„ ์ €์žฅํ•ด์ค€๋‹ค.
lastIdx์—๋Š” ์ƒˆ๋กœ์šด ์ขŒํ‘œ๋ฅผ ์ €์žฅํ•ด๋‘”๋‹ค.
5. board๋ฅผ ๋Œ๋ฉด์„œ ์•ˆ์ต์€ํ† ๋งˆํ† (0)๊ฐ€ ์žˆ๋Š” ์ง€ ํ™•์ธํ•˜๊ณ  isCooked์— ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ด๋‘”๋‹ค.
6. lastIdx๋ฅผ ์ด์šฉํ•ด ์ถœ๋ ฅํ•œ๋‹ค.

๋ฐ˜์‘ํ˜•