๋ฐฑ์ค€ - ์•„๊ธฐ ์ƒ์–ด(Swift)

2022. 11. 30. 14:44ใ†Algorithm

๋ฐฑ์ค€ - ์•„๊ธฐ ์ƒ์–ด(Swift)

 

 

 ๋ฌธ์ œ ์„ค๋ช…

 

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

 

16236๋ฒˆ: ์•„๊ธฐ ์ƒ์–ด

N×N ํฌ๊ธฐ์˜ ๊ณต๊ฐ„์— ๋ฌผ๊ณ ๊ธฐ M๋งˆ๋ฆฌ์™€ ์•„๊ธฐ ์ƒ์–ด 1๋งˆ๋ฆฌ๊ฐ€ ์žˆ๋‹ค. ๊ณต๊ฐ„์€ 1×1 ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ํ•œ ์นธ์—๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์ตœ๋Œ€ 1๋งˆ๋ฆฌ ์กด์žฌํ•œ๋‹ค. ์•„๊ธฐ ์ƒ์–ด์™€ ๋ฌผ๊ณ ๊ธฐ๋Š” ๋ชจ๋‘ ํฌ๊ธฐ๋ฅผ ๊ฐ€

www.acmicpc.net

 

 ๋‚˜์˜ ํ’€์ด

 

๋‹ค๋ฅธ ๋ถ„์˜ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ–ˆ์ง€๋งŒ ์ด์ œ ์ด๋Ÿฐ ๋ฌธ์ œ๋Š” ํ’€ ์ค„ ์•Œ์•„์•ผํ•œ๋‹ค.

์•„๊ธฐ์ƒ์–ด์˜ ์œ„์น˜์—์„œ ์ตœ์†Œ์˜ ์œ„์น˜๋ฅผ ์ฐพ๋Š” ๊ฒƒ์€ BFS์ด๋ฉฐ 2์ฐจ์› ๋ฐฐ์—ด์„ ๊ธฐ์กด์˜ ๋ฐฐ์—ด, ๊ทผ์ ‘ํ•œ ๋ฌผ๊ณ ๊ธฐ๋“ค์˜ ๋ฐฐ์—ด์„ ์„ ์–ธํ•จ์œผ๋กœ์จ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์ž์‹ ๋ณด๋‹ค ํฐ ๋ฌผ๊ณ ๊ธฐ์˜ ๊ฒฝ์šฐ์—๋Š” ์•„์˜ˆ ์–ด๋– ํ•œ ๋กœ์ง๋„ ๊ฑฐ์น˜์ง€ ์•Š์Œ์œผ๋กœ์จ ๋ฌด์‹œํ•˜๊ณ  ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐฉ๋ฌธํ‘œ์‹œ๋ฅผ ํ•˜๋Š” ์ด์œ ๋Š” ๊ทธ ๊ฑฐ๋ฆฌ๊นŒ์ง€๋Š” ์ด๋ฏธ ์ตœ์†Œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋˜ ๊ฐฑ์‹ ํ•˜์ง€ ๋ง์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (๋ฐฉ๋ฌธํ‘œ์‹œ๋Š” 0์ด ์•„๋‹ˆ๋ผ๋ฉด ๋ฐฉ๋ฌธํ‘œ์‹œ๊ฐ€ ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ–ˆ๋‹ค)

 

import Foundation

let N = Int(readLine()!)!
let dx = [-1, 0, 1, 0]
let dy = [0, -1, 0, 1]
var arr = [[Int]]()
var shark = (0, 0)
var queue = [(Int, Int)]()
var distance = [[Int]]()
var fish = [(Int, Int, Int)]()
var result = 0
var size = 2
var exp = 0
let xRange = 0..<N
let yRange = 0..<N
for _ in 0..<N {
    arr.append(readLine()!.components(separatedBy:" ").map{Int($0)!})
}

for i in 0..<N {
    for j in 0..<N {
        if arr[i][j] == 9 {
            shark = (i, j)
            arr[i][j] = 0
        }
    }
}

func BFS() {
    var index = 0
    distance[shark.0][shark.1] = 1 // ์ƒ์–ด๊ฐ€ ์žˆ๋Š” ๊ณณ์— ๋ฐฉ๋ฌธํ‘œ์‹œ
    queue.append((shark.0, shark.1))
    
    while index < queue.count {
        let cur = queue[index]
        index += 1
        
        for i in 0..<4 {
            var nx = cur.0 + dx[i]
            var ny = cur.1 + dy[i]
            
            // ๋ฒ”์œ„์•ˆ์— ์žˆ๊ณ , ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ฒƒ๋“ค์— ๋Œ€ํ•ด์„œ๋งŒ ํƒ์ƒ‰
            if xRange ~= nx, yRange ~= ny, distance[nx][ny] == 0 {
                // ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์กด์žฌํ•˜๊ณ  ๊ทธ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ํ˜„์žฌ ์ƒ์–ด๋ณด๋‹ค ์ž‘๋‹ค๋ฉด
                if arr[nx][ny] != 0, arr[nx][ny] < size {
                    distance[nx][ny] = distance[cur.0][cur.1] + 1
                    fish.append((nx, ny, distance[nx][ny]))
                } 
                // ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์กด์žฌํ•˜์ง€์•Š๊ฑฐ๋‚˜ ๊ทธ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ํ˜„์žฌ ์ƒ์–ด์™€ ํฌ๊ธฐ๊ฐ€ ๊ฐ™๋‹ค๋ฉด 
                if arr[nx][ny] == 0 || arr[nx][ny] == size {
                    distance[nx][ny] = distance[cur.0][cur.1] + 1
                    queue.append((nx, ny))
                } 
            }
        }
        
    }
    
}

while true {
    queue = [(Int, Int)]()
    distance = Array(repeating: Array(repeating: 0, count: N), count: N)
    fish = [(Int, Int, Int)]()
    BFS()
    
    if fish.isEmpty {
        print(result)
        break
    }
    
    fish = fish.sorted { $0.2 == $1.2 ? 
                        ( $0.0 == $1.0 ? $0.1 < $1.1 : $0.0 < $1.0) :
                        $0.2 < $1.2 }
    
    shark = (fish[0].0, fish[0].1) // ์ƒ์–ด ํ˜„์žฌ์œ„์น˜ ๋ณ€๊ฒฝ
    exp += 1
    if size == exp { size += 1; exp = 0 } // ๊ฒฝํ—˜์น˜๊ฐ€ ๋„๋‹ฌํ–ˆใ„ท์ž๋ฉด size๋ฅผ ํ‚ค์šด๋‹ค.
    arr[fish[0].0][fish[0].1] = 0 // ์ƒ์–ด๊ฐ€ ๋„๋‹ฌํ–ˆ์œผ๋‹ˆ ํ•ด๋‹น์ž๋ฆฌ๋ฅผ 0์œผ๋กœ ๋ฆฌ์…‹
    result += (fish[0].2 - 1) // ์•„๊ธฐ์ƒ์–ด์—์„œ ๋ฌผ๊ณ ๊ธฐ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ”๊ฐ€. 1์„ ๋นผ๋Š” ์ด์œ ๋Š” ๋ฐฉ๋ฌธํ‘œ์‹œ๋ฅผ ์œ„ํ•ด ์ฒ˜์Œ์— 1์„ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ
}