๋ฌธ์ ์ค๋ช
์ฒ ์์ ํ ๋งํ ๋์ฅ์์๋ ํ ๋งํ ๋ฅผ ๋ณด๊ดํ๋ ํฐ ์ฐฝ๊ณ ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ํ ๋งํ ๋ ์๋์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๊ฒฉ์ ๋ชจ์ ์์์ ์นธ์ ํ๋์ฉ ๋ฃ์ด์ ์ฐฝ๊ณ ์ ๋ณด๊ดํ๋ค.
์ฐฝ๊ณ ์ ๋ณด๊ด๋๋ ํ ๋งํ ๋ค ์ค์๋ ์ ์ต์ ๊ฒ๋ ์์ง๋ง, ์์ง ์ต์ง ์์ ํ ๋งํ ๋ค๋ ์์ ์ ์๋ค. ๋ณด๊ด ํ ํ๋ฃจ๊ฐ ์ง๋๋ฉด, ์ต์ ํ ๋งํ ๋ค์ ์ธ์ ํ ๊ณณ์ ์๋ ์ต์ง ์์ ํ ๋งํ ๋ค์ ์ต์ ํ ๋งํ ์ ์ํฅ์ ๋ฐ์ ์ต๊ฒ ๋๋ค. ํ๋์ ํ ๋งํ ์ ์ธ์ ํ ๊ณณ์ ์ผ์ชฝ, ์ค๋ฅธ์ชฝ, ์, ๋ค ๋ค ๋ฐฉํฅ์ ์๋ ํ ๋งํ ๋ฅผ ์๋ฏธํ๋ค. ๋๊ฐ์ ๋ฐฉํฅ์ ์๋ ํ ๋งํ ๋ค์๊ฒ๋ ์ํฅ์ ์ฃผ์ง ๋ชปํ๋ฉฐ, ํ ๋งํ ๊ฐ ํผ์ ์ ์ ๋ก ์ต๋ ๊ฒฝ์ฐ๋ ์๋ค๊ณ ๊ฐ์ ํ๋ค. ์ฒ ์๋ ์ฐฝ๊ณ ์ ๋ณด๊ด๋ ํ ๋งํ ๋ค์ด ๋ฉฐ์น ์ด ์ง๋๋ฉด ๋ค ์ต๊ฒ ๋๋์ง, ๊ทธ ์ต์ ์ผ์๋ฅผ ์๊ณ ์ถ์ด ํ๋ค.
ํ ๋งํ ๋ฅผ ์ฐฝ๊ณ ์ ๋ณด๊ดํ๋ ๊ฒฉ์๋ชจ์์ ์์๋ค์ ํฌ๊ธฐ์ ์ต์ ํ ๋งํ ๋ค๊ณผ ์ต์ง ์์ ํ ๋งํ ๋ค์ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋, ๋ฉฐ์น ์ด ์ง๋๋ฉด ํ ๋งํ ๋ค์ด ๋ชจ๋ ์ต๋์ง, ๊ทธ ์ต์ ์ผ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ. ๋จ, ์์์ ์ผ๋ถ ์นธ์๋ ํ ๋งํ ๊ฐ ๋ค์ด์์ง ์์ ์๋ ์๋ค.
์ ๋ ฅ
์ฒซ ์ค์๋ ์์์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๋ ๋ ์ ์ 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์ ๋ฌธ์ ๋ผ ๊ทธ๋ ๊ฒ ์ด๋ ต์ง ์๊ฒ ํ์ดํ ์ ์์๋ ๊ฒ ๊ฐ๋ค.
- ํ๋ฅผ ์ฌ์ฉํ๋๋งํผ ํ ํ ๋ ์๊ฐ๋ณต์ก๋๋ฅผ ๋ ์๊ฐํด์ค์ผํ ๊ฒ ๊ฐ๋ค.
๋ฌธ์
'3๏ธโฃ Swift > Problem Solving' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift Algorithm] ์จ๋ฐ๊ผญ์ง BOJ #1697 (2) | 2021.10.05 |
---|---|
[Swift Algorithm] ๋ถ! BOJ #4179 (0) | 2021.10.02 |
[Swift Algorithm] ๋ฏธ๋ก ํ์ BOJ #2178 (0) | 2021.10.01 |
[Swift Algorithm] ๊ทธ๋ฆผ BOJ #1926 (0) | 2021.09.30 |
[Swift Algorithm] ์ฃผ์ BOJ #11501 (0) | 2021.09.02 |
๋๊ธ