๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
3๏ธโƒฃ Swift/Problem Solving

[Swift Algorithm] ํ† ๋งˆํ†  BOJ #7576

by seolhee2750 2021. 10. 2.
๋ฌธ์ œ ์„ค๋ช…

์ฒ ์ˆ˜์˜ ํ† ๋งˆํ†  ๋†์žฅ์—์„œ๋Š” ํ† ๋งˆํ† ๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ํฐ ์ฐฝ๊ณ ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ํ† ๋งˆํ† ๋Š” ์•„๋ž˜์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๊ฒฉ์ž ๋ชจ์–‘ ์ƒ์ž์˜ ์นธ์— ํ•˜๋‚˜์”ฉ ๋„ฃ์–ด์„œ ์ฐฝ๊ณ ์— ๋ณด๊ด€ํ•œ๋‹ค.

์ฐฝ๊ณ ์— ๋ณด๊ด€๋˜๋Š” ํ† ๋งˆํ† ๋“ค ์ค‘์—๋Š” ์ž˜ ์ต์€ ๊ฒƒ๋„ ์žˆ์ง€๋งŒ, ์•„์ง ์ต์ง€ ์•Š์€ ํ† ๋งˆํ† ๋“ค๋„ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ๋ณด๊ด€ ํ›„ ํ•˜๋ฃจ๊ฐ€ ์ง€๋‚˜๋ฉด, ์ต์€ ํ† ๋งˆํ† ๋“ค์˜ ์ธ์ ‘ํ•œ ๊ณณ์— ์žˆ๋Š” ์ต์ง€ ์•Š์€ ํ† ๋งˆํ† ๋“ค์€ ์ต์€ ํ† ๋งˆํ† ์˜ ์˜ํ–ฅ์„ ๋ฐ›์•„ ์ต๊ฒŒ ๋œ๋‹ค. ํ•˜๋‚˜์˜ ํ† ๋งˆํ† ์˜ ์ธ์ ‘ํ•œ ๊ณณ์€ ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ, ์•ž, ๋’ค ๋„ค ๋ฐฉํ–ฅ์— ์žˆ๋Š” ํ† ๋งˆํ† ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์— ์žˆ๋Š” ํ† ๋งˆํ† ๋“ค์—๊ฒŒ๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ๋ชปํ•˜๋ฉฐ, ํ† ๋งˆํ† ๊ฐ€ ํ˜ผ์ž ์ €์ ˆ๋กœ ์ต๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ์ฒ ์ˆ˜๋Š” ์ฐฝ๊ณ ์— ๋ณด๊ด€๋œ ํ† ๋งˆํ† ๋“ค์ด ๋ฉฐ์น ์ด ์ง€๋‚˜๋ฉด ๋‹ค ์ต๊ฒŒ ๋˜๋Š”์ง€, ๊ทธ ์ตœ์†Œ ์ผ์ˆ˜๋ฅผ ์•Œ๊ณ  ์‹ถ์–ด ํ•œ๋‹ค.

ํ† ๋งˆํ† ๋ฅผ ์ฐฝ๊ณ ์— ๋ณด๊ด€ํ•˜๋Š” ๊ฒฉ์ž๋ชจ์–‘์˜ ์ƒ์ž๋“ค์˜ ํฌ๊ธฐ์™€ ์ต์€ ํ† ๋งˆํ† ๋“ค๊ณผ ์ต์ง€ ์•Š์€ ํ† ๋งˆํ† ๋“ค์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ฉฐ์น ์ด ์ง€๋‚˜๋ฉด ํ† ๋งˆํ† ๋“ค์ด ๋ชจ๋‘ ์ต๋Š”์ง€, ๊ทธ ์ตœ์†Œ ์ผ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ผ. ๋‹จ, ์ƒ์ž์˜ ์ผ๋ถ€ ์นธ์—๋Š” ํ† ๋งˆํ† ๊ฐ€ ๋“ค์–ด์žˆ์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค.

 

์ž…๋ ฅ

์ฒซ ์ค„์—๋Š” ์ƒ์ž์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‘ ์ •์ˆ˜ M,N์ด ์ฃผ์–ด์ง„๋‹ค. M์€ ์ƒ์ž์˜ ๊ฐ€๋กœ ์นธ์˜ ์ˆ˜, N์€ ์ƒ์ž์˜ ์„ธ๋กœ ์นธ์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋‹จ, 2 ≤ M,N ≤ 1,000 ์ด๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ๋Š” ํ•˜๋‚˜์˜ ์ƒ์ž์— ์ €์žฅ๋œ ํ† ๋งˆํ† ๋“ค์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ฆ‰, ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ์ƒ์ž์— ๋‹ด๊ธด ํ† ๋งˆํ† ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ํ•˜๋‚˜์˜ ์ค„์—๋Š” ์ƒ์ž ๊ฐ€๋กœ์ค„์— ๋“ค์–ด์žˆ๋Š” ํ† ๋งˆํ† ์˜ ์ƒํƒœ๊ฐ€ M๊ฐœ์˜ ์ •์ˆ˜๋กœ ์ฃผ์–ด์ง„๋‹ค. ์ •์ˆ˜ 1์€ ์ต์€ ํ† ๋งˆํ† , ์ •์ˆ˜ 0์€ ์ต์ง€ ์•Š์€ ํ† ๋งˆํ† , ์ •์ˆ˜ -1์€ ํ† ๋งˆํ† ๊ฐ€ ๋“ค์–ด์žˆ์ง€ ์•Š์€ ์นธ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

ํ† ๋งˆํ† ๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ ์žˆ๋Š” ๊ฒฝ์šฐ๋งŒ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.

 

์ถœ๋ ฅ

์—ฌ๋Ÿฌ๋ถ„์€ ํ† ๋งˆํ† ๊ฐ€ ๋ชจ๋‘ ์ต์„ ๋•Œ๊นŒ์ง€์˜ ์ตœ์†Œ ๋‚ ์งœ๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ, ์ €์žฅ๋  ๋•Œ๋ถ€ํ„ฐ ๋ชจ๋“  ํ† ๋งˆํ† ๊ฐ€ ์ต์–ด์žˆ๋Š” ์ƒํƒœ์ด๋ฉด 0์„ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๊ณ , ํ† ๋งˆํ† ๊ฐ€ ๋ชจ๋‘ ์ต์ง€๋Š” ๋ชปํ•˜๋Š” ์ƒํ™ฉ์ด๋ฉด -1์„ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ์ œ

์ž…๋ ฅ

6 4
1 -1 0 0 0 0
0 -1 0 0 0 0
0 0 0 0 -1 0
0 0 0 0 -1 1

์ถœ๋ ฅ

 6

 

๋‚ด ๋ฌธ์ œ ํ’€์ด
import Foundation

let size = readLine()!.split(separator: " ").map({Int(String($0))!}) // ์ƒ์ž ํฌ๊ธฐ
let m = size[0] // ๊ฐ€๋กœ ์นธ ์ˆ˜
let n = size[1] // ์„ธ๋กœ ์นธ ์ˆ˜
var box = [[Int]]() // ์ฃผ์–ด์ง„ ๋ฐ•์Šค
var queue = [(Int, Int)]()
let dx = [-1, 1, 0 , 0], dy = [0, 0, -1, 1] // ์ƒํ•˜์ขŒ์šฐ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ์ขŒํ‘œ ๋ณ€ํ™”๋Ÿ‰
var empty = 0 // 0์œผ๋กœ ์ฑ„์›Œ์ง„ ์ž๋ฆฌ๋“ค์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ˆ„์ !
var count = 0 // 0์„ 1๋กœ ๋ฐ”๊พธ๋Š” ํšŸ์ˆ˜๋ฅผ ๋ˆ„์ !

for _ in 0..<n {
    box.append(readLine()!.split(separator: " ").map({Int(String($0))!}))
}

// bfs ํ•จ์ˆ˜ ๊ตฌํ˜„
func bfs() {
    var index = 0 // queue๋ฅผ removeFirstํ•˜๋‹ˆ๊นŒ ์‹œ๊ฐ„์ดˆ๊ณผ,, => ๊ตณ์ด ์ œ๊ฑฐํ•˜์ง€์•Š๊ณ  ์ธ๋ฑ์Šค๋กœ ์ฐพ์•„์คŒ.
    
    while index < queue.count {
        let (x, y) = queue[index]
        index += 1
        
        for i in 0..<4 {
            let nx = x + dx[i]
            let ny = y + dy[i]
            
            if nx < 0 || ny < 0 || nx >= n || ny >= m { continue } // ์˜ˆ์™ธ
            
            if box[nx][ny] == 0 {
                queue.append((nx, ny)) // 1๋กœ ๋ฐ”๋€Œ์—ˆ์œผ๋ฏ€๋กœ ํ์— ์ถ”๊ฐ€
                box[nx][ny] = box[x][y] + 1 // 1๋กœ ๋ฐ”๊พธ๋ฉด์„œ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„ ๋ˆ„์ 
                count += 1 // 0์—์„œ 1๋กœ ๋ฐ”๊พผ ํšŸ์ˆ˜ ๋ˆ„์ 
            }
        }
    }
}

// ๋ฉ”์ธ ์ฝ”๋“œ ์‹คํ–‰ ์ „, ๋ฐ•์Šค์— ์žˆ๋Š” ์ต์€ ํ† ๋งˆํ†  ๋ฐ ์•ˆ์ต์€ ํ† ๋งˆํ†  ์ฒดํฌ
for x in 0..<n {
    for y in 0..<m {
        if box[x][y] == 1 { queue.append((x, y)) } // 1์ด๋ฉด ํ์— ์ถ”๊ฐ€
        else if box[x][y] == 0 { empty += 1 } // 0์ด๋ฉด empty์— ๊ฐœ์ˆ˜ ๋ˆ„์ 
    }
}

bfs() // ํ•จ์ˆ˜ ์‹คํ–‰

empty == 0 ? print(0) : (empty == count ? print(box.flatMap({$0}).max()!-1) : print(-1))

๐Ÿ‘‰ ์ต์€ ํ† ๋งˆํ† ๋“ค์˜ ์œ„์น˜๋ฅผ ๋จผ์ € ์ฐพ๊ณ , ๊ทธ ํ† ๋งˆํ† ๋“ค์„ ์‹œ์ž‘์ ์œผ๋กœ ํผ์ ธ๋‚˜๊ฐ€๋Š”๊ฒŒ ํฌ์ธํŠธ!

์•ž์„œ ํ’€์—ˆ๋˜ ๋‘ bfs๋ฌธ์ œ๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํƒ์ƒ‰ํ•˜๋Š”๊ฑด ๋™์ผํ•˜์ง€๋งŒ,

์‹œ์ž‘์ ์ด 0,0์ด ์•„๋‹ˆ๋ผ 1์ด ๋“ค์–ด์žˆ๋Š” ๋ชจ๋“  ์ž๋ฆฌ๋ผ๋Š” ์ ์ด ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์ธ๋“ฏ

๊ทธ๋ฆฌ๊ณ  ์ด ๋ฌธ์ œ๋Š” ํ† ๋งˆํ† ๊ฐ€ ๋ชจ๋‘ ์ต์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ, ์ฒ˜์Œ ๋ฐ•์Šค์— ์žˆ๋˜ 0์˜ ๊ฐœ์ˆ˜์™€

๋ชจ๋“  ์‹คํ–‰์ด ๋๋‚ฌ์„ ๋•Œ์˜ 0์˜ ๊ฐœ์ˆ˜๋ฅผ ๋น„๊ตํ•ด์ค„ ์ˆ˜ ์žˆ์–ด์•ผํ•œ๋‹ค.!!

  • ๊ฐ€์žฅ ๋จผ์ € 2์ค‘ for๋ฌธ์„ ํ™œ์šฉํ•ด์„œ 1์ด ๋“ค์–ด์žˆ๋Š” ์ž๋ฆฌ๋Š” queue ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•ด์ฃผ๊ณ ,
    0์ผ ๊ฒฝ์šฐ์—๋Š” empty ๋ณ€์ˆ˜๋กœ ๊ฐœ์ˆ˜๋ฅผ ๋ˆ„์ ํ–ˆ๋‹ค. (-1์ธ ๊ฒฝ์šฐ๋Š” ๊ทธ๋ƒฅ ๋ฌด์‹œ,!)
  • ๋‹ค์Œ์—” bfs ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด์ฃผ์—ˆ๋‹ค.
    index ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•ด์„œ queue๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๊ฒ€์‚ฌํ–ˆ๋‹ค.
    (์ด์ „ ๋ฌธ์ œ์—์„œ๋Š” removeFirst๋ฅผ ํ•ด์„œ ์‹ค์ œ๋กœ ํŒ์„ ์ˆ˜ํ–‰ํ•ด์คฌ๋Š”๋ฐ,
    ๊ทธ๋ ‡๊ฒŒ ํ•˜๋‹ˆ๊นŒ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ๋“ค์„ ํ•˜๋‚˜์”ฉ ์˜ฎ๊ฒจ์•ผํ•˜๋ฏ€๋กœ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜๊ฑธ๋ฆผ.
    ์–ด์ฐจํ”ผ ์ด ๋ฌธ์ œ์—์„œ๋Š” ๊ตณ์ด ์•ž ์š”์†Œ๋“ค์„ ์‚ญ์ œํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๋ฌธ์ œ ์—†์œผ๋ฏ€๋กœ ์ด๋ ‡๊ฒŒ,,!!)
    while๋ฌธ ์•ˆ์—์„œ๋Š” queue์—์„œ ๊บผ๋‚ด๋Š” ์š”์†Œ๋งˆ๋‹ค for๋ฌธ์œผ๋กœ ๋”ฑ 4๋ฒˆ ๋ฐ˜๋ณตํ•˜์—ฌ
    ๋ชจ๋“  ๋ฐฉํ–ฅ์˜ ์ž๋ฆฌ๋“ค์„ ๊ฒ€์‚ฌํ•ด์ฃผ์—ˆ๊ณ , ๊ฒ€์‚ฌํ•œ ์ž๋ฆฌ๊ฐ€ 0์ผ ๊ฒฝ์šฐ์—๋Š” ํ์— ํ•ด๋‹น ์ž๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ ,
    ํ•ด๋‹น ์ž๋ฆฌ์— ์ง€๊ธˆ๊นŒ์ง€ ์˜ค๋ฉด์„œ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์„ ๋ˆ„์ ํ•œ ๊ฐ’์„ ์ €์žฅํ–ˆ๋‹ค. ๋˜ ์ด ๋•Œ ์นด์šดํŠธ๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
  • ๋ชจ๋“  ์‹คํ–‰์ด ์ข…๋ฃŒ๋˜์—ˆ์„ ๋•Œ count๊ฐ’๊ณผ empty๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด 
    (์ฒ˜์Œ ์•ˆ์ต์€ ํ† ๋งˆํ† ์˜ ๊ฐœ์ˆ˜ == ์ตํžŒ ํ† ๋งˆํ† ์˜ ๊ฐœ์ˆ˜)์ด๋ฏ€๋กœ, ๋ชจ๋“  ํ† ๋งˆํ† ๋ฅผ ์ตํžˆ๋Š”๋ฐ์— ์„ฑ๊ณตํ–ˆ๋‹ค๋Š” ๊ฒƒ,,!
    ๋”ฐ๋ผ์„œ ๊ทธ ๋•Œ๋Š” ๋ฐ•์Šค ๋ฐฐ์—ด์— ์ฑ„์›Œ์ง„ ๊ฐ€์žฅ ํฐ ์ˆ˜๋ฅผ ์ฐพ์•„์ค€๋‹ค.

 

๐Ÿ’ก ํ”ผ๋“œ๋ฐฑ
  • ๊ทธ์ „์— ํ’€์—ˆ๋˜ ๋ฌธ์ œ์—์„œ ์ชผ๊ธˆ! ๊ผฌ์ธ bfs๋ฌธ์ œ์ธ๋“ฏํ•˜๋‹ค.
  • ๊ทธ๋ž˜๋„ ๋‹จ์ˆœํžˆ 0, 1์˜ ๋ฌธ์ œ๋ผ ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€ ์•Š๊ฒŒ ํ’€์ดํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.
  • ํ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋งŒํผ ํŒ ํ• ๋•Œ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๋” ์ƒ๊ฐํ•ด์ค˜์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค.

 


 

๋ฌธ์ œ

https://www.acmicpc.net/problem/7576

๋Œ“๊ธ€