โ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/2636
โ ๋ฌธ์ ํ์ด ์์ด๋์ด
๋ฌธ์ ๊ฐ ๊ต์ฅํ ๋ํดํ๊ฒ ์๊ฒผ๊ธฐ ๋๋ฌธ์ ,,,, ์ฒ์์ BFS ๋ฌธ์ ์ธ์ง ๊ฐ์ด ์์กํ๋ค. ์ธํฐ๋ท์ ์ฐพ์๋ณด๋, ์ด ๋ฌธ์ ์ ํต์ฌ์ ๋ค์๊ณผ ๊ฐ์๋ค.
- ๊ฐ์ด๋ฐ ๊ตฌ๋ฉ๋ซ๋ฆฐ ๋ถ๋ถ์ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋๋ค. ์ด์ฐจํผ BFS ๋ก ํ์์ (0,0)๋ถํฐ ์์ํ๊ฒ๋๋ฉด, ๊ตฌ๋ฉ์ผ๋ก ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋ค. ์ธ๋ถ ๊ณต๊ธฐ์๋ฆฌ๋ถํฐ ํ์์ ์์ํ๋ฉด ์ด์ฐจํผ ๊ตฌ๋ฉ ๋ด๋ถ๋ก ์ ๊ทผํ ์ ์๊ธฐ๋๋ฌธ!!
- ๊ฐ์ฅ์๋ฆฌ๋ ํญ์ ์ธ๋ถ๊ณต๊ธฐ๋ก ๋๋ฌ์์ฌ์๋ค. ๊ทธ๋์ (0,0)์ผ๋ก ์์ํ๋ฉด, ํญ์ ์ธ๋ถ๊ณต๊ธฐ๋ถํฐ ํ์์ ์์ํ๊ฒ๋๊ณ , ์ธ๋ถ๊ณต๊ธฐ๋ฅผ queue์ ๋ฃ์ด ํ์์ ํ๊ธฐ ์์ํ๋๊น ๋ด๋ถ ๊ณต๊ธฐ๋ก๋ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒฐ๋ก ์ด ๋์จ๋ค. (ํด์ํ๊ธฐ ํ๋ค์์ ใ ใ )
๊ทธ๋์ (0,0)๋ถํฐ ํญ์ ํ์์ ์์ํ๊ณ , ์น์ฆ๊ฐ ์๋ ์๋ฆฌ (1) ์ ๋ง๋๋ฉด ํด๋น ์๋ฆฌ๋ฅผ 0์ผ๋ก ๋ฐ๊ฟ์ฃผ๊ณ , ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅด ํด์ค๋ค. (์ด ์๋ฆฌ๋ queue์ ๋ฃ์ด์ฃผ์ง ์๋๋ค.) ๊ทธ๋ฆฌ๊ณ ์น์ฆ๋ฅผ ๋ น์๋ค๋ฉด, cnt์ +1 ํด์ค์ผ๋ก์จ ๋ น์ธ์น์ฆ์ ๊ฐฏ์๋ฅผ ์ธ์ด์ค๊ฒ์ด๋ค. ๋ง์ฝ ๋ง์ฃผ์น ์๋ฆฌ๊ฐ ๊ณ์ํด์ ์ธ๋ถ๊ณต๊ธฐ (0)์ด๋ผ๋ฉด, ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๊ณ queue์ ๋ฃ๋ ๋ฐฉ์์ ๋ฐ๋ณตํ๋ค.
๋ น์ธ ์น์ฆ์ ๊ฐฏ์๋ cheeseCnt ๋ฐฐ์ด์ ๋ฃ์ด์ค ๊ฒ์ด๋ค. ๋ง์ง๋ง์ '๋ค๋ น๊ธฐ ์ ์ ์น์ฆ์ ์'๋ฅผ ์ถ๋ ฅํด์ฃผ์ด์ผํ๊ธฐ ๋๋ฌธ์, ๋ฐฐ์ด๋ก ๊ฐ๊ฐ์ ๋จ๊ณ๋ง๋ค ๋ น์ธ ์น์ฆ์ ๊ฐฏ์๋ฅผ ๋ฃ์ด์ฃผ๊ณ , ๋งจ ๋ค์์ ํ๋ ์์์๋ ๊ฐ์ ์ถ๋ ฅํด์ค ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๋ น์ธ ์๊ฐ time ์ bfs๊ฐ ํ๋ฒ๋์๊ฐ ๋๋ง๋ค +1์ ํด์ฃผ์ด ์ถ๋ ฅํด์ค ๊ฒ์ด๋ค.
โ ์ ์ฒด ์์ค์ฝ๋
https://github.com/deslog/Algorithm/blob/main/Algorithm/Boj/2636_%EC%B9%98%EC%A6%88/main.swift
//
// main.swift
// Algorithm
//
// Created by LeeJiSoo on 2022/07/06.
//
// ref: https://hooongs.tistory.com/264
let dx = [-1, 1, 0, 0]
let dy = [0, 0, -1, 1]
let nm = readLine()!.split(separator: " ").map { Int(String($0))! }
let n = nm[0]
let m = nm[1]
var cheeseCnt = [Int]()
var cheeseBoard = [[Int]]()
var time = 0
var cnt = 0
for _ in 0..<n {
cheeseBoard.append(readLine()!.split(separator: " ").map{ Int(String($0))! })
}
func bfs() -> Int {
var visited = Array(repeating: Array(repeating: false, count: m), count: n) // bfs๋๋๋ง๋ค 0,0๋ถํฐ ์์ํ๋๊น visited ๋ ์ด๊ธฐํ
var queue = [(Int, Int)]() // bfs๋ queue ์ด๊ธฐํ
queue.append((0, 0))
visited[0][0] = true
cnt = 0 // ํ๋ฒ ๋ ๋ ๋ช๊ฐ์ ์น์ฆ๊ฐ ์ฌ๋ผ์ง๋์ง count -> ๋์ค์ cheesecnt์ ๋ฃ์ด์ค๊ฑฐ์
while !queue.isEmpty {
let xy = queue.removeFirst()
let x = xy.0
let y = xy.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, !visited[nx][ny] {
if cheeseBoard[nx][ny] == 0 { // ๊ณต๊ธฐ์๋ฆฌ ์ผ ๋
visited[nx][ny] = true
queue.append((nx, ny))
} else if cheeseBoard[nx][ny] == 1 { // ์น์ฆ๊ฐ ์๋ ์์น์ผ ๋
visited[nx][ny] = true
cheeseBoard[nx][ny] = 0
cnt += 1
}
}
}
}
cheeseCnt.append(cnt)
return cnt
}
while true {
time += 1
cnt = bfs()
if cnt == 0 { // ๋์ด์ ๋
น์ ์น์ฆ๊ฐ ์๋ค๋ ๋ป
break
}
}
print(time-1)
print(cheeseCnt[cheeseCnt.count-2])