๋ฌธ์
https://www.acmicpc.net/problem/16236
๋ด ๋ฌธ์ ํ์ด
let n = Int(readLine()!)!
var space = [[Int]]() // ์ฃผ์ด์ง ๊ณต๊ฐ์ ๋ํ ์ ๋ณด
var fish = [(Int, Int, Int)]() // ๋จนํ ๋ฌผ๊ณ ๊ธฐ์ (x ์ขํ, y ์ขํ, ์๊ธฐ ์์ด์์ ๊ฑฐ๋ฆฌ)๋ค์ ์ ์ฅํ ๋ฐฐ์ด
var shark = (0, 0) // ์์ด ์์น
var distance = [[Int]]() // ์ฃผ์ด์ง ๊ณต๊ฐ์ ์นธ๋ง๋ค ์๊ธฐ ์์ด๊ฐ ํด๋น ์์น๋ก ์ค๋๋ฐ ๊ฑธ๋ฆฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅ
var count = 0 // ์๊ธฐ ์์ด์ ํฌ๊ธฐ ์ฆ๊ฐ๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํ ์นด์ดํธ ๋ณ์
var size = 2 // ์๊ธฐ ์์ด ํฌ๊ธฐ
let dx = [0, 0, -1, 1]
let dy = [-1, 1, 0, 0]
var queue = [(Int, Int)]()
var result = 0
for _ in 0..<n { space.append(readLine()!.split(separator: " ").map({Int(String($0))!})) }
func bfs() {
var index = 0 // index ๋ณ์๋ฅผ ์ด์ฉํด์ removeFirst ํผํด์ค
queue.append(shark) // ํ์ ํ์ฌ ์์ด ์์น ์ถ๊ฐ
distance[shark.0][shark.1] = 1 // ํด๋น ์์น๋ฅผ ์ค๋ณตํด์ ํ์ํ์ง ์๋๋ก, ์์ ์์น์ด์ง๋ง ๊ฑฐ๋ฆฌ๋ฅผ 1๋ก ์ค์ ํด์ฃผ์ด ์ฐจ๋ณํํด์ฃผ์์
// ๋ ์ด์ ํ์ํด์ผ ํ ์ขํ๊ฐ ์์ ๋๊น์ง ๋ฐ๋ณต
while index < queue.count {
let (x, y) = queue[index]
index += 1 // queue์ ์ ์ฅ๋์ด์๋ ํ ์ขํ์ ํ์์ ์์ํ์์ผ๋ฏ๋ก, index ํ ์นธ ์ฎ๊ฒจ์ฃผ๊ธฐ
// ์ํ์ข์ฐ ํ์์ ์ํด 4๋ฒ ๋ฐ๋ณต
for i in 0..<4 {
// ํ์ํ ์ขํ ์ค์
let nx = x + dx[i]
let ny = y + dy[i]
if nx < 0 || ny < 0 || nx >= n || ny >= n || distance[nx][ny] != 0 { continue } // ์์ธ
// ํ์ํ ์๋ฆฌ์ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๊ณ , ์๊ธฐ ์์ด๋ณด๋ค ์ฌ์ด์ฆ๊ฐ ์์ ๋ (๋ฌผ๊ณ ๊ธฐ ๋จน๊ธฐ์ ์ฑ๊ณตํ ๊ฒฝ์ฐ)
if space[nx][ny] != 0 && space[nx][ny] < size {
distance[nx][ny] = distance[x][y] + 1 // [x][y] ์๋ฆฌ์์ ํ ์นธ ๋ ์์์ ํ์
fish.append((nx, ny, distance[nx][ny])) // ๋จนํ ๋ฌผ๊ณ ๊ธฐ์ ์ขํ์ ๊ฑฐ๊ธฐ๊น์ง ๊ฑธ๋ฆฐ ๊ฑฐ๋ฆฌ์ ๋ํ ์ ๋ณด๋ฅผ ์ถ๊ฐ
continue
}
// ํ์ํ ์๋ฆฌ์ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๊ฑฐ๋, ์๊ธฐ์์ด์ ์ฌ์ด์ฆ๊ฐ ๊ฐ์ ๋ (์์ง ๋จน์ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์ฐพ์ง ๋ชปํ ๊ฒฝ์ฐ)
if space[nx][ny] == 0 || space[nx][ny] == size {
distance[nx][ny] = distance[x][y] + 1 // [x][y] ์๋ฆฌ์์ ํ ์นธ ๋ ์์์ ํ์
queue.append((nx, ny)) // ํ์ํด์ผ ํ ์ขํ๋ฅผ ์ถ๊ฐ
}
}
}
}
for i in 0..<n {
for j in 0..<n {
if space[i][j] == 9 { shark = (i, j); space[i][j] = 0 } // ์๊ธฐ ์์ด์ ์ด๊ธฐ ์์น ์ฐพ๊ณ , ํด๋น ์๋ฆฌ๋ 0์ผ๋ก ์ฑ์์ฃผ๊ธฐ
}
}
while true {
// bfs ํจ์ ๋๋ฆฌ๊ธฐ ์ ์ด๊ธฐํ
fish = [(Int, Int, Int)]()
distance = Array(repeating: Array(repeating: 0, count: n), count: n)
queue = [(Int, Int)]()
bfs()
if fish.isEmpty { print(result); break } // ์ด๋ฒ bfs ํจ์ ์คํ์์๋ ๋จนํ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ค๋ ๋ป์ผ๋ก, result ๊ฐ์ ๊ทธ๋๋ก ์ถ๋ ฅ, ์คํ ์ข
๋ฃ !
count += 1
// ์๊ธฐ ์์ด์์ ๊ฑฐ๋ฆฌ๊ฐ ์งง์๋ ๊ฒ๋ถํฐ ์ค๋ฆ์ฐจ์, x์ขํ๊ฐ ์์ ๊ฒ๋ถํฐ ์ค๋ฆ์ฐจ์, y์ขํ๊ฐ ์์ ๊ฒ๋ถํฐ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ
// (์๊ธฐ ์์ด๋ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ฌผ๊ณ ๊ธฐ๋ถํฐ ๋จน๊ณ , ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ๊น์ด ๋ฌผ๊ณ ๊ธฐ๊ฐ ๋ง๋ค๋ฉด ๊ฐ์ฅ ์์ ์๋ ๋ฌผ๊ณ ๊ธฐ, ๊ทธ๋ฌํ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์ฌ๋ฌ๋ง๋ฆฌ๋ผ๋ฉด ๊ฐ์ฅ ์ผ์ชฝ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋๋ค๋ ์กฐ๊ฑด์ ์ํจ)
fish = fish.sorted {
if $0.2 <= $1.2 {
if $0.0 == $1.0 { return $0.1 < $1.1 }
else { return $0.0 < $1.0 }
}
else { return false }
}
space[fish[0].0][fish[0].1] = 0 // ์์์ ์กฐ๊ฑด์ ๋ง๊ฒ ๋จนํ ๋ฌผ๊ณ ๊ธฐ๋ค์ ์ ๋ ฌํ์์ ๋, ๊ฐ์ฅ ๋จผ์ ๋จนํ๋๊ฒ ๋ง๋ ๋ฌผ๊ณ ๊ธฐ์ ์๋ฆฌ๋ฅผ 0์ผ๋ก ๋ฐ๊ฟ์ค
result += distance[fish[0].0][fish[0].1] - 1 // ํด๋น ๋ฌผ๊ณ ๊ธฐ์ ์๊ธฐ ์์ด์์ ๊ฑฐ๋ฆฌ์์ 1์ ๋บ ๊ฐ์ result์ ๋ํด์ค
// ์๊ธฐ ์์ด์ ํฌ๊ธฐ๊ฐ count์ ๊ฐ์์ก์ ๊ฒฝ์ฐ ์์ด ํฌ๊ธฐ ์ฆ๊ฐ (์๊ธฐ ์์ด๋ ์์ ์ ํฌ๊ธฐ์ ๊ฐ์ ์์ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์ ๋๋ง๋ค ํฌ๊ธฐ๊ฐ 1 ์ฆ๊ฐํ๋ค๋ ์กฐ๊ฑด์ ์ํจ)
if size == count { size += 1; count = 0 }
shark = (fish[0].0, fish[0].1) // ๋จน์ ๋ฌผ๊ณ ๊ธฐ์ ์๋ฆฌ๋ก ์์ด ์์น ๋ฐ๊ฟ์ค
}
๐ bfs, ๊ตฌํ ๋ฌธ์ ๋ก, ์ฃผ์ด์ง ์กฐ๊ฑด์ ์ ์ฝ๊ณ ! ์ ๋ฆฌํ์ฌ ํ์ด์ผ ํ๋ค.
ํ ๋ฒ์ bfs ํจ์ ์คํ ์๋ง๋ค ์ด๋ค ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋ ๊ฒ์ด ๊ฐ์ฅ ํจ์จ์ ์ธ์ง ๋ฐ์ง๊ณ ,
๋ ์ด์ ๋จน์ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์์ ๊ฒฝ์ฐ์ ์คํ์ ์ข
๋ฃํด์ฃผ์๋ค.
[ bfs ํจ์ ]
- queue์ ํ์ํด์ผ ํ ์์น๋ค์ ์ถ๊ฐํด์ฃผ๋ฉด์ ๋ฐ๋ณต์ด ์งํ๋๋๋ก ํ๋๋ฐ,
removeFirst ํ์ง ์๊ณ index ๋ณ์๋ฅผ ํ์ฉํ์ฌ ์๊ฐ ๋ณต์ก๋๋ฅผ ์ค์๋ค.
๋ฐ๋ผ์ while์ ํ์ ๊ธธ์ด๊ฐ index๋ณด๋ค ์งง์์ง๊ธฐ ์ ๊น์ง,
๊ทธ๋ฌ๋๊น ๋ ์ด์ ํ์ํ ์ขํ ๊ฐ์ด ์์ ๋๊น์ง ๋ฐ๋ณตํ๋๋ก ํด์ฃผ์๋ค. - distance๋ผ๋ 2์ฐจ์ ๋ฐฐ์ด์ ์ฃผ์ด์ง n*n ๊ณต๊ฐ๊ณผ ๊ฐ์ ํฌ๊ธฐ๋ก ์์ฑํ๊ณ 0์ผ๋ก ์ฑ์์ฃผ์๋๋ฐ,
์๊ธฐ ์์ด๊ฐ ํด๋น ์ขํ๊น์ง ๊ฐ๋๋ฐ์ ๊ฑธ๋ฆฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ๋ง๋ ๋ฐฐ์ด์ด๋ค.
๊ทธ๋ฆฌ๊ณ ํจ์ ์ค๊ฐ ์์ธ ์ฒ๋ฆฌ์ฉ if๋ฌธ์ ๋ณด๋ฉด, distance[nx][ny]๊ฐ 0์ด ์๋ ๊ฒฝ์ฐ๋ฅผ ์์ธ๋ก ๋ฃ์๋๋ฐ,
์ด๋ ๊ฒ distance ํจ์๋ ์ด๋ฏธ ๊ทธ ์๋ฆฌ๋ฅผ ์ง๋๊ฐ๋์ง ํ๋จํ ์ ์๊ฒ ํด์ฃผ๋ ์ญํ ๋ ํ๋ค.
ํจ์ ์ด๋ฐ์, distance ๋ฐฐ์ด์ ์๊ธฐ ์์ด์ ์ถ๋ฐ ์์น์ 1์ ๋ฃ์ ๊ฒ์
์์ง ์์ ์์น์ด๋ฏ๋ก 1๋งํผ ์ด๋ํ์ง๋ ์์์ง๋ง ์ด๋ฏธ ์ง๋๊ฐ ๊ณณ์์ ํ์ํ๊ธฐ ์ํจ์ด๋ค.
๋ฐ๋ผ์ ๋์ค์ distance ๋ฐฐ์ด์์ ์ง์ง ์ด๋ํ ๊ฑฐ๋ฆฌ๋ฅผ ์๋ ค๋ฉด ํด๋น ๊ฑฐ๋ฆฌ์์ 1์ ๋นผ์ค์ผ ํ๋ค. - while๋ฌธ ์์์๋ ์ํ์ข์ฐ ํ์์ ์ํ for๋ฌธ์ ๋๋ ค์ฃผ์๋ค.
dx, dy๋ฅผ ์ด์ฉํ์ฌ nx, ny๋ฅผ ์ฐพ์ ํด๋น ์๋ฆฌ๋ฅผ ํ์ํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ์งํํ๊ณ ,
ํด๋น ์ขํ๊ฐ ์ฃผ์ด์ง ๊ณต๊ฐ์์ ๋ฒ์ด๋๊ฑฐ๋ ์ด๋ฏธ ํ์ํ๋ ์๋ฆฌ์ผ ๊ฒฝ์ฐ๋ ์์ธ๋ก ๋นผ์ continue ํ๋ค. - ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ธ์๋, ํ์ํ (nx, ny) ์ขํ์ ๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ ๊ฒฝ์ฐ์ ์๋ ๊ฒฝ์ฐ๋ก ๋๋ด๋ค.
๋จน์ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ๊ทธ ๋ฌผ๊ณ ๊ธฐ์ ๋ํ ์ ๋ณด๋ฅผ fish ๋ฐฐ์ด์ ์ถ๊ฐํ ํ continue ํ๊ณ ,
๋จน์ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ๋ ๊ทธ ์๋ฆฌ์ ์ฃผ๋ณ ์๋ฆฌ๋ค์ ํ์ํด์ผ ํ๋ฏ๋ก queue์ ์ขํ๋ฅผ ์ถ๊ฐํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ ๊ฒฝ์ฐ ๋ชจ๋ ํ ์นธ ๋ ์ด๋ํ์ผ๋ฏ๋ก, distance ๋ฐฐ์ด์ ๊ฐฑ์ ํ๋ค.
=> bfs ํจ์์์๋ ํ์ฌ ์๊ธฐ ์์ด์ ์ ์ฅ์์ ์ต์ด๋ก ๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๋ค์ ๋ํ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋ค.
[ ๋ฉ์ธ ์คํ๋ฌธ ]
- ์๊ธฐ ์์ด์ ์ด๊ธฐ ์์น๋ฅผ ์ฐพ์์ shark์ ์ ์ฅํ๊ณ , ํด๋น ์๋ฆฌ๋ 0์ผ๋ก ๋ฐ๊ฟ์ฃผ์๋ค.
- while๋ฌธ์ ๋ฐ๋ณปํ๋ฉฐ ๋จน์ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ํ๋์ฉ ์ฐพ์์ฃผ๋ ์์ผ๋ก ํ์ดํ๋ค.
while์์๋ ๊ฐ๊ฐ fish, distance, queue๋ฅผ ์ด๊ธฐํํด์ค ํ bfs๋ฅผ ์คํํ๋ค. - bfs ํจ์์ ์คํ์ด ๋๋ฌ์ ๋ fish ๋ฐฐ์ด์ด ๋น์ด์๋ค๋ฉด
๊ณต๊ฐ์ ๋ ์ด์ ๋จน์ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์์๋ค๋ ์๋ฏธ์ด๋ฏ๋ก, result ๊ฐ์ ๊ทธ๋๋ก ์ถ๋ ฅํ๊ณ ์คํ์ ์ข ๋ฃํ๋ค. - fish ๋ฐฐ์ด์ด ๋น์ด์์ง ์์ ๊ฒฝ์ฐ์๋ ํ๋์ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์ ์ ์๋ค๋ ์๋ฏธ์ด๋ฏ๋ก
count๋ฅผ ์ถ๊ฐํด์ ํ๋์ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์๋ค๋ ๊ฒ์ ํ์ํด์ค๋ค. - fish ๋ฐฐ์ด์ ๋ฌธ์ ์์ ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ง๊ฒ ์ ๋ ฌํด์ค๋ค.
์ด๋ฒ bfs ์คํ์์ ์ป์ ์ ๋ณด๋ฅผ ํ ๋๋ก ์ด๋ค ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์ด์ผ ํ๋์ง ๊ฒฐ์ ํ๊ธฐ ์ํจ์ด๋ค.
์ ๋ ฌ์ด ๋๋๋ฉด fish ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์์์ ์ ์ฅ๋ ๋ฌผ๊ณ ๊ธฐ๊ฐ ๋น์ฒจ์ด๋ค.
space์์ ํด๋น ๋ฌผ๊ณ ๊ธฐ์ ์๋ฆฌ๋ 0์ผ๋ก ๋ฐ๊ฟ์ฃผ๊ณ , result์ ํด๋น ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋ ๋ฐ ๊ฑธ๋ฆฐ ๊ฑฐ๋ฆฌ๋ฅผ ๋ํ๋ค. - ๋ง์ฝ ์๊ธฐ ์์ด์ ํฌ๊ธฐ๊ฐ count์ ๊ฐ์์ก๋ค๋ฉด,
์์ ์ ํฌ๊ธฐ์ ๊ฐ์ ์๋งํผ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์๋ค๋ ์๋ฏธ์ด๋ฏ๋ก ์ฌ์ด์ฆ๋ฅผ ์ฆ๊ฐ์์ผ์ฃผ์๋ค. - ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก๋ ์๊ธฐ ์์ด์ ์์น๋ฅผ ํด๋น ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ ์๋ฆฌ๋ก ์ฎ๊ฒจ์ฃผ์ด
์๋ก์ด ๋ฐ๋ณต์ ์คํํ ์ ์๊ฒ ์ค๋นํ๋ค.
๐ก ํผ๋๋ฐฑ
- ์ ๋ง ์ ๋ง ์ด๋ ค์ ๋ค.ใ
dfs๋ ๊ทธ๋๋ง ์ข ์ต์ํด์ง ๊ฒ ๊ฐ์๋ฐ bfs๋ ๊ณ์ ์ด์ํ ๋๋์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฑด bfs๋ฅผ ๋ ๋์ ์์ ๋นก๊ตฌํ ๋ฌธ์ ๊ฐ์์ ๋ ํ๋ค์๋ค.ใ - ์กฐ๊ฑด๋ ๋ง์์ ์ฃผ์ด์ง ์กฐ๊ฑด๋ค์ ๋ฏธ๋ฆฌ ์ ์ ๋ฆฌํด์ ํ์ด์ผ ํ๋ ๋ฌธ์ ๊ฐ๋ค.
- ๋ค์ ํ ๋ฒ ๊ผญ ํ์ด๋ณด์..~!~
'3๏ธโฃ Swift > Problem Solving' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift Algorithm] ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ BOJ #2206 (0) | 2022.01.26 |
---|---|
[Swift Algorithm] ์ ๋ก์์ฝ BOJ #10026 (0) | 2022.01.23 |
[Swift Algorithm] ํ ํธ๋ก๋ฏธ๋ ธ BOJ #14500 (2) | 2022.01.19 |
[Swift Algorithm] ์ด์ค์ฐ์ ์์ํ Programmers(Lv.3) (0) | 2021.12.21 |
[Swift Algorithm] ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ 4 BOJ #11659 (2) | 2021.10.20 |
๋๊ธ