์๋ ํ์ธ์ ์ ์ธ์ ๋๋ค :)
PS ๊ธ์ ์ค๋๋ง์ธ ๊ฒ ๊ฐ์๋ฐ.. ์ค๋์ ๋ฐฑ์ค ๋ฌธ์ ์ค ํ๋๋ฅผ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํฉ๋๋ค!
BFS ๋ฌธ์ ์ธ๋ฐ ํ๋ฒ ๋ ์๊ฐํด์ผ ๋ ๋ถ๋ถ์ด ์๋ ๋ฌธ์ ์ฌ์ ์ ๋ฆฌํด๋๋ฉด ์ข์ ๊ฒ ๊ฐ์์ ์ฒ์์ผ๋ก ๋ฐฑ์ค ๋ฌธ์ ๋ฅผ ๊ฐ์ ธ์๋ดค์ต๋๋ค.
๋ฐ๋ก ์์ํ๊ฒ ์ต๋๋ค !
๋ฌธ์ ๋งํฌ
๋ฌธ์ ํ์ด
๊ฐ๋จํ๊ฒ ๋ฌธ์ ์๊ตฌ ์ฌํญ์ ์ ๋ฆฌํด๋ณด์๋ฉด, 2์ฐจ์ ๋ฐฐ์ด์ ๋น์ฐ์ ๊ฐ ๋ถ๋ถ๋ณ ๋์ด ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋๋ฐ, ์ธ์ ํ ์นธ์ด 0์ผ ๊ฒฝ์ฐ(๊ทธ๋ฆผ์์ ๋น์นธ), ๋น์ฐ์ด ์ผ๋ ๋ง๋ค ๊ทธ ์นธ์ ์ธ์ ํ ๋น์นธ์ ๊ฐ์๋งํผ ์ค์ด๋ญ๋๋ค. ๊ตฌํด์ผ ํ๋ ๊ฒ์ ์ฃผ์ด์ง ๊ทธ๋ํ๊ฐ ๋ ๊ฐ ์ด์์ผ๋ก ๋ถ๋ฆฌ๋๋ ๋ฐ๊น์ง ๊ฑธ๋ฆฌ๋ ์ต์ ์๊ฐ(๋ )์ด์์ต๋๋ค.
์ธ์ ํ ๋ ธ๋ ์ค 0์ธ ๋ ธ๋์ ๊ฐ์๋ฅผ ๊ตฌํด ํด๋น ์นธ์ด 0์ด ๋ ๋๊น์ง ๊ณ์ฐํ๊ณ , ๊ทธ๋ํ๊ฐ ์ธ์ ๋ ๊ฐ๋ก ๋ถ๋ฆฌ๋๋์ง ๊ตฌํ๋ฉด ๋๋ ๋ฌธ์ ์ด๊ธฐ ๋๋ฌธ์ BFS๋ก ํ๋ฉด ๋๊ฒ ๋ค๋ ์์ด๋์ด๊ฐ ๋ฐ๋ก ๋ ์ฌ๋๋๋ฐ์,
1. BFS๋ก ์ธ์ ํ 0์ ๊ฐ์ ํ์
2. ๋น์ฐ ๋ น์ด๊ธฐ
3. ๋ ๋ฉ์ด๋ฆฌ๋ก ๋๋๊ฑฐ๋, ๋ชจ๋ ๋น์ฐ์ด 0์ด ๋๋ฉด ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ ํ ์ข ๋ฃ
์์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํ์ ํด์ ๋๋ ค๋ดค๋๋ฐ.. ์๊ฐํ ๊ฒฐ๊ณผ๊ฐ ๋์ค์ง ์๋๋ผ๊ตฌ์..??
๊ทธ๋์ ๋ค๋ฅธ ํ์ด๋ค์ ์ฐพ์๋ดค๋๋ฐ,, ์ ๊ฐ ๋์น ๋ถ๋ถ์ด ์์์ต๋๋ค..
(1, 1) ์์น์ ๋ ธ๋์ ์ธ์ ํ ๋น์นธ์ 2๊ฐ(๋ ธ๋์ ๋ถ๋ถ)์ด๋ฏ๋ก, 1๋ ์ด ์ง๋๋ฉด 0์ด ๋ฉ๋๋ค. (1, 2) ์์น์ ๋ ธ๋๋ ์ธ์ ํ ๋น์นธ์ด 2๊ฐ(ํ๋์ ๋ถ๋ถ) 1๋ ์ด ์ง๋๋ฉด -2๊ฐ ๋์ด 2๊ฐ ๋๊ณ , ๋ 1๋ ์ด ์ง๋๋ฉด ๋ -2๊ฐ ๋์ด 2๋ ํ์ 0์ด ๋๋ ๊ฒ์ด ๋ง๊ฒ ์ฃ ??
ํ์ง๋ง,, ์ ๊ฐ ์ง ๋ก์ง์์๋ ๋ฐ๋ก ์ ๋ ธ๋์ธ (1, 1) ๋ ธ๋๊ฐ 1๋ ํ 0์ด ๋๊ธฐ ๋๋ฌธ์ 2๋ ์งธ ๋๋ ํด์ (1, 2) ๋ ธ๋์ ์ธ์ ํ ๋น์นธ ๊ฐ์๊ฐ 3๊ฐ๋ก ๊ณ์ฐ์ด ๋๊ณ ์์์ต๋๋ค.. ํด๊ฐ ๊ฐ์๋ก ์ ์ 0์ด ๋๋ ์นธ์ ๊ฐ์๊ฐ ๋์ด๋๊ธฐ ๋๋ฌธ์ ๋ค์ ๊ฒฐ๊ณผ ๊ฐ์ ์ํฅ์ ์ค ์ ์๋ค๋ ์๊ฐ์ ํ์ง ๋ชปํด์ ๊ฒฐ๊ณผ๊ฐ ์๊ฐํ ๊ฒ๊ณผ ๋ค๋ฅด๊ฒ ๋์ค๋ ๋ฌธ์ ๊ฐ ์๊ฒผ๋๋ฐ์, ๊ทธ๋ ๋ค๋ฉด ์ด๊ธฐ ๋ฐฐ์ด์ ์ ์ฅํด๋๊ณ ํด๋น ๋ฐฐ์ด๊ณผ ๋น๊ตํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ํ์ด๋ฅผ ํ๋ฉด ์ํ๋ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ๊ฒ ๊ฐ๋ค์!
โญ๏ธ ์ด ๋ฌธ์ ์ ๊ตฌํ ํฌ์ธํธ โญ๏ธ
โ ๊ทธ๋ํ์ ํ ์ํ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋น์ฐ์ ๋ น์ด๋ฉด ์๋จ
โญ๏ธ ๋น์ฐ์ ์ผ๋ง๋ ๋ น์ฌ์ผ ๋๋์ง ๊ณ์ฐํ ๋, ์ด๊ธฐ ๊ทธ๋ํ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ณ์ฐํ๊ธฐ
Swift ํ์ด ์ฝ๋
import Foundation
let directions = [(0, 1), (1, 0), (-1, 0), (0, -1)]
let input = readLine()!.split(separator: " ").map {Int($0)!}
let (n, m) = (input[0], input[1])
var arr: [[Int]] = [] // ๋น์ฐ ๋์ด ์ ๋ณด ๋ด๋ 2์ฐจ์ ๋ฐฐ์ด
var visited: [[Int]] = Array(repeating: Array(repeating: 0, count: m), count: n) // ๋ฐฉ๋ฌธ ์ฌ๋ถ ์ฒดํฌ (๋ช๋ฒ์งธ ๋
๋์ ๋ฐฉ๋ฌธํ๋์ง)
// ์ฃผ์ด์ง ๋น์ฐ์ ๋์ด ์ ๋ณด arr์ ์ ์ฅ
for _ in 0..<n {
let row = readLine()!.split(separator: " ").map {Int($0)!}
arr.append(row)
}
var count = 1 // ๋ฉ์ด๋ฆฌ ๊ฐ์
var answer = 0 // ๋ช๋ฒ์งธ ํด์ธ์ง ์ ์ฅ
func bfs(_ graph: inout [[Int]], _ x: Int, _ y: Int) {
var queue = [(x, y)]
while !queue.isEmpty {
let (currentX, currentY) = queue.removeFirst()
for (dx, dy) in directions {
let qx = dx + currentX
let qy = dy + currentY
// ์ธ์ ๋
ธ๋ ๋ฒ์ ์ฒดํฌ & ๋ฐฉ๋ฌธ ์ฌ๋ถ ์ฒดํฌ
if qx >= 0 && qx < n && qy >= 0 && qy < m && visited[qx][qy] < answer {
if graph[qx][qy] > 0 { // ํด๋น ์นธ์ด ๋น์ฐ์ธ ๊ฒฝ์ฐ
visited[qx][qy] = answer // ๋ฐฉ๋ฌธ ํ์
queue.append((qx, qy)) // ํ์ ์ถ๊ฐ
} else { // ํด๋น ์นธ์ด ๋ฐ๋ค์ธ ๊ฒฝ์ฐ
graph[currentX][currentY] -= 1 // ๋น์ฐ ๋์ด ๊ฐ์์ํด
}
}
}
}
}
while count == 1 { // ๋น์ฐ์ด ํ๋์ ๋ฉ์ด๋ฆฌ๋ก ์ด์ด์ ธ ์๋ ๋์ ๋ฐ๋ณต
count = 0 // count 0์ผ๋ก ์ด๊ธฐํ. bfs ์ํ๋๋ฉด(= ๋
น์ผ ๋น์ฐ์ด ์๋ค๋ฉด) 1์ด ๋จ
answer += 1
for i in 0..<n {
for j in 0..<m {
// ์ด๋ฒ ํด์ ๋ฐฉ๋ฌธํ์ง ์๋ ๋น์ฐ ์ฐพ๊ธฐ
if arr[i][j] > 0 && visited[i][j] < answer {
visited[i][j] = answer
count += 1 // bfs๊ฐ 2๋ฒ ์ด์ ํธ์ถ๋๋ฉด ๋ฉ์ด๋ฆฌ๊ฐ 2๊ฐ ์ด์์ด๋ผ๋ ๋ป
bfs(&arr, i, j)
}
}
}
if count == 0 { // ๋
น์ผ ๋น์ฐ์ด ์๋ ๊ฒฝ์ฐ(= ๋ค 0์ด๋ผ๋ ๋ป)
answer = 1
break
}
}
print(answer - 1)