๋ฌธ์ ์ค๋ช
์งํ์ด๋ ๋ฏธ๋ก์์ ์ผ์ ํ๋ค. ์งํ์ด๋ฅผ ๋ฏธ๋ก์์ ํ์ถํ๋๋ก ๋์์ฃผ์!
๋ฏธ๋ก์์์ ์งํ์ด์ ์์น์ ๋ถ์ด ๋ถ์ ์์น๋ฅผ ๊ฐ์ํด์ ์งํ์ด๊ฐ ๋ถ์ ํ๊ธฐ์ ์ ํ์ถํ ์ ์๋์ง์ ์ฌ๋ถ, ๊ทธ๋ฆฌ๊ณ ์ผ๋ง๋ ๋นจ๋ฆฌ ํ์ถํ ์ ์๋์ง๋ฅผ ๊ฒฐ์ ํด์ผํ๋ค.
์งํ์ด์ ๋ถ์ ๋งค ๋ถ๋ง๋ค ํ์นธ์ฉ ์ํ๋๋ ์์ง์ผ๋ก(๋น์ค๋ฌํ๊ฒ ์ด๋ํ์ง ์๋๋ค) ์ด๋ํ๋ค.
๋ถ์ ๊ฐ ์ง์ ์์ ๋ค ๋ฐฉํฅ์ผ๋ก ํ์ฐ๋๋ค.
์งํ์ด๋ ๋ฏธ๋ก์ ๊ฐ์ฅ์๋ฆฌ์ ์ ํ ๊ณต๊ฐ์์ ํ์ถํ ์ ์๋ค.
์งํ์ด์ ๋ถ์ ๋ฒฝ์ด ์๋ ๊ณต๊ฐ์ ํต๊ณผํ์ง ๋ชปํ๋ค.
์ ๋ ฅ
์ ๋ ฅ์ ์ฒซ์งธ ์ค์๋ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋ ๋ ์ ์ R๊ณผ C๊ฐ ์ฃผ์ด์ง๋ค. ๋จ, 1 ≤ R, C ≤ 1000 ์ด๋ค. R์ ๋ฏธ๋ก ํ์ ๊ฐ์, C๋ ์ด์ ๊ฐ์์ด๋ค.
๋ค์ ์ ๋ ฅ์ผ๋ก R์ค๋์ ๊ฐ๊ฐ์ ๋ฏธ๋ก ํ์ด ์ฃผ์ด์ง๋ค.
๊ฐ๊ฐ์ ๋ฌธ์๋ค์ ๋ค์์ ๋ปํ๋ค.
- #: ๋ฒฝ
- .: ์ง๋๊ฐ ์ ์๋ ๊ณต๊ฐ
- J: ์งํ์ด์ ๋ฏธ๋ก์์์ ์ด๊ธฐ์์น (์ง๋๊ฐ ์ ์๋ ๊ณต๊ฐ)
- F: ๋ถ์ด ๋ ๊ณต๊ฐ
J๋ ์ ๋ ฅ์์ ํ๋๋ง ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์งํ์ด๊ฐ ๋ถ์ด ๋๋ฌํ๊ธฐ ์ ์ ๋ฏธ๋ก๋ฅผ ํ์ถ ํ ์ ์๋ ๊ฒฝ์ฐ IMPOSSIBLE ์ ์ถ๋ ฅํ๋ค.
์งํ์ด๊ฐ ๋ฏธ๋ก๋ฅผ ํ์ถํ ์ ์๋ ๊ฒฝ์ฐ์๋ ๊ฐ์ฅ ๋น ๋ฅธ ํ์ถ์๊ฐ์ ์ถ๋ ฅํ๋ค.
์ ์ถ๋ ฅ ์์
์ ๋ ฅ
4 4
####
#JF#
#..#
#..#
์ถ๋ ฅ
3
๋ด ๋ฌธ์ ํ์ด
import Foundation
let size = readLine()!.split(separator: " ").map({Int(String($0))!})
let n = size[0] // ๊ฐ๋ก ์นธ ์
let m = size[1] // ์ธ๋ก ์นธ ์
var maze = [[String]]() // ์ฃผ์ด์ง ๋ฏธ๋ก
var queue_J = [(Int, Int)]() // ์งํ์ด ํ
var queue_F = [(Int, Int)]() // ๋ถ ํ
let dx = [-1, 1, 0 , 0], dy = [0, 0, -1, 1] // ์ํ์ข์ฐ ๊ฒ์์ ์ํ ์ขํ ๋ณํ๋
var result = 0 // ํ์ถ ์๊ฐ
func Fire(_ next: inout [(Int, Int)]) {
// ๊ธฐ์กด ๋ถ ํ์ ๋ค์ด์๋ ์๋ฆฌ๋ค์ ๋ชจ๋ ๊ฒ์ฌ!
for i in 0..<queue_F.count {
let (x, y) = queue_F[i]
for j in 0..<4 {
let nx = x + dx[j]
let ny = y + dy[j]
// ๋ฏธ๋ก ๋ฒ์ ์์์ "."์ ๋ง๋ ๊ฒฝ์ฐ ๋ถ์ด ์ ํ๋์์์ "F"๋ก ํ์
if 0 <= nx && 0 <= ny && nx < n && ny < m {
if maze[nx][ny] == "." {
maze[nx][ny] = "F"
next.append((nx, ny)) // ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ๋น ๋ฐฐ์ด next์ ์ ํ๋ ์ขํ๋ฅผ ํ๋์ฉ ์ถ๊ฐ
}
}
}
}
}
func Jihoon(_ next: inout [(Int, Int)]) -> Bool {
// ๊ธฐ์กด ์งํ์ด ํ์ ๋ค์ด์๋ ์๋ฆฌ๋ค์ ๋ชจ๋ ๊ฒ์ฌ!
for i in 0..<queue_J.count {
let (x, y) = queue_J[i]
for j in 0..<4 {
let nx = x + dx[j]
let ny = y + dy[j]
// ๋ฏธ๋ก ๋ฒ์ ์์์ "."์ ๋ง๋ ๊ฒฝ์ฐ "J"๋ก ํ์
if 0 <= nx && 0 <= ny && nx < n && ny < m {
if maze[nx][ny] == "." {
maze[nx][ny] = "J"
next.append((nx,ny)) // ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ๋น ๋ฐฐ์ด next์ ์ด๋ํ ์ขํ๋ฅผ ํ๋์ฉ ์ถ๊ฐ
}
}
// ๊ฒ์ํ๋ ๋ฒ์๊ฐ ๋ฏธ๋ก ๋ฐ์ด๋ผ๋ฉด ์งํ์ด๋ ํ์ถ์ ์ฑ๊ณตํ๊ฒ,!! ๋ฐ๋ผ์ true ๋ฆฌํด
else { return true }
}
}
return false
}
// ===== ===== ===== ๋ฉ์ธ ์คํ ===== ===== =====
for _ in 0..<n {
maze.append(Array(readLine()!).map({String($0)}))
}
for x in 0..<n {
for y in 0..<m {
if maze[x][y] == "J" { queue_J.append((x, y)) } // ์ฒ์ ์งํ์ด์ ์์น ์ ์ฅ
else if maze[x][y] == "F" { queue_F.append((x, y)) } // ์ฒ์ ๋ถ์ ์์น ์ ์ฅ
}
}
while true {
// (๋ฐ๋ณต๋ง๋ค ์๋ก์ด ๋น ๋ฐฐ์ด์ด ํ์ํ๋ฏ๋ก ์ฌ๊ธฐ์ ์ ์ธ)
var next_J = [(Int, Int)]() // ๋ค์์ ํ์ํ ์งํ์ด์ ์์น๋ค
var next_F = [(Int, Int)]() // ๋ค์์ ํ์ํ ๋ถ์ ์์น๋ค
// ๋์ด์ ํ์ํ ์งํ์ด๊ฐ ์์ ๋ (์ ๋ถ ์ด๋ฏธ ๋ถ๊ณผ ๋ง๋ฌ๊ฑฐ๋ ๋ฒฝ์ ๋ถ๋ชํ์)
if queue_J.isEmpty { print("IMPOSSIBLE"); break }
result += 1 // ์งํ์ด๋ ๋ถ์ด ํ ๋ฒ ์ฃผ๋ณ์ผ๋ก ํผ์ ธ๋๊ฐ ๋๋ง๋ค ๋์ ๋๋ ๊ฐ => ํ์ถ ์๊ฐ ์ธก์
Fire(&next_F) // ๋ถ ํผ์ ธ๋๊ฐ๋ ์คํ
// ์งํ์ด๊ฐ ํ์ถํ๋ ์คํ์ผ๋ก, ํ์ถ์ ์ฑ๊ณตํ์ ์(true) result๋ฅผ ์ถ๋ ฅํ๊ณ ๋!
if Jihoon(&next_J) == true { print(result); break }
// ์งํ์ด ์ด๋ ํ์ ๋ถ ์ด๋ ํ์ ์๋ก ์
๋ฐ์ดํธ๋ ํ ๋ฃ์ด์ฃผ๊ธฐ
queue_J = next_J
queue_F = next_F
}
๐์งํ์ด์ ๋ถ์ด ์์ํ๋ ์์น๋ฅผ ๋ฏธ๋ฆฌ ์ฐพ๊ณ , ๊ฐ๊ฐ์ bfs๋ฅผ ๋ฐ๋ก ๋๋ ค์ผํ๋ค๋ ์ ์ด ํฌ์ธํธ,!
์งํ์ด๊ฐ ์์ง์ด๋ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ ํจ์์ ๋ถ์ด ์์ง์ด๋ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ ํจ์๋ฅผ ๋ฐ๋ก ์์ฑํ๊ณ ,
ํ ๋ฒ์ ์์ง์ผ ์ ์๋ ๋งํผ์ฉ๋ง ํ์ํ๋ ๊ฒ์ '๋์์' ๋ฐ๋ณตํ๋๋ก ํด์ผํ๋ค.
- ์ฐ์ ์งํ์ด์ ์๋ฆฌ๋ฅผ ๋ด์ queue_J, ๋ถ์ ์๋ฆฌ๋ฅผ ๋ด์ queue_F๋ฅผ ์์ฑํ๊ณ
2์ค for๋ฌธ์ ์ด์ฉํด J๋ฅผ ์ฐพ์ผ๋ฉด queue_J์, F๋ฅผ ์ฐพ์ผ๋ฉด ๊ทธ ์๋ฆฌ๋ฅผ queue_F์ ๋ด์๋ค. - while๋ฌธ์ผ๋ก ์คํ์ ๋ฐ๋ณตํ๋๋ฐ, ๋ฐ๋ณต๋ง๋ค ์๋ก์ด ์์น๋ฅผ ๋ด์ ํ next_J, next_F๋ฅผ ์์ฑํ๋ค.
1) queue_J๊ฐ ๋น๊ฒ๋์๋ค๋ฉด ๋์ด์ ํ์ํ ์งํ์ด์ ์๋ฆฌ๊ฐ ์๋ค๋ ์๋ฏธ์ธ๋ฐ,
์ด๋๊น์ง Jihoonํจ์์ ์คํ ๊ฒฐ๊ณผ๋ก ์ธํ ์คํ ์ข ๋ฃ๊ฐ ์์๋ ๊ฒ์ด๋ฏ๋ก
์งํ์ด๋ ํ์ถ์ ์คํจํ์์ ์ ์ ์๋ค. ๋ฐ๋ผ์ IMPOSSIBLE์ ์ถ๋ ฅํด์ฃผ์๋ค.
2) ๊ทธ ์ธ์ ๊ฒฝ์ฐ์๋ ์งํ์ด๊ฐ ํ์ถํ๋๋ฐ ๊ฑธ๋ฆฐ ์๊ฐ์ ์ธก์ ํด์ผํ๋ฏ๋ก result์ 1์ ๋์ ํ๋ค.
3) ๊ทธ๋ฆฌ๊ณ Fire, Jihoonํจ์๋ฅผ ์คํ์์ผ์
ํ์ฌ ๊ฐ ํ์ ๋ด๊ฒจ์๋ ์๋ฆฌ๋ค์ด 'ํ ๋ฒ์ฉ' ์์ผ๋ก ํผ์ ธ๋๊ฐ๋ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํด์ฃผ์๋ค.
Jihoon ํจ์์ ์คํ ๊ฒฐ๊ณผ๊ฐ true๋ผ๋ฉด ํ์ถ์ ์ฑ๊ณตํ๋ค๋ ์๋ฏธ์ด๋ฏ๋ก ์คํ์ ์ข ๋ฃํ๋ค.
4) ๋ง์ง๋ง์ผ๋ก ๊ธฐ์กด ํ๋ฅผ ๋ค์๋ฒ ๋ฐ๋ณต์์ ํ์ํด์ผํ ์๋ฆฌ๋ค๋ก ์ ๋ฐ์ดํธํด์ค๋ค. - Fire์ด๋ผ๋ ์ด๋ฆ์ ๋ถ์ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ bfsํจ์๋ฅผ ๋จผ์ ํ์ธํด๋ณด์.
for๋ฌธ์ ์ด์ฉํ์ฌ ๊ธฐ์กด ํ์ ๋ค์ด์๋ ๋ชจ๋ ์๋ฆฌ๋ฅผ ๊ฒ์ฌํด์ฃผ์๋ค.
ํ์ for๋ฌธ์์ ๋ฑ 4๋ฒ ๋ฐ๋ณต์ ํ์ฌ ์๋ฆฌ๋ง๋ค ์ํ์ข์ฐ๋ก ํ์ํ๋๋ฐ,
๋ฏธ๋ก์ ๋ฒ์ ์์์ "."์ ๋ง๋ฌ๋ค๋ฉด "F"๋ฅผ ์ ์ฅํ์ฌ ๋ถ์ด ํผ์ก์์ ํ์ํ๋ค.
๊ทธ๋ฆฌ๊ณ inout์ผ๋ก ๋ฐ์ ๋น ๋ฐฐ์ด next์ ๋ค์๋ฒ ํจ์ ์คํ์์ ํ์ํด์ผํ ์๋ฆฌ๋ค์ ์ถ๊ฐํ๋ค.
=> ์ด Fireํจ์๋ ์คํ์ ๊ฒฐ๊ณผ๋ก ๋ค์์ ํ์ํ ์๋ก์ด ๋ถ ํ๋ฅผ ๋ง๋ค์ด์ฃผ๋๊ฒ,!! - Jihoon์ด๋ผ๋ ์ด๋ฆ์ ์งํ์ด์ ํ์ถ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ bfsํจ์๋ฅผ ๋ณด์.
Fire๊ณผ ๊ฐ์ ๋ก์ง์ผ๋ก ์คํํ๋๋ฐ, ํ๋ ๋ค๋ฅธ ์ ์ Bool ๊ฐ์ ๋ฆฌํดํ๋ค๋ ๊ฒ.
์๋ก ํ์ํ ์ฐจ๋ก์ธ ์๋ฆฌ๊ฐ ๋ฏธ๋ก์ ๋ฒ์๋ฅผ ๋์ด์ ๋ค๋ฉด, ์งํ์ด๊ฐ ํ์ถ์ ์ฑ๊ณตํ๋ค๋ ๋ป!
๋ฐ๋ผ์ ์ด ๋๋ true๋ฅผ ์ถ๋ ฅํด์ฃผ๊ณ , ๊ทธ ์ธ์ ์ํฉ์ ๋ชจ๋ false๋ฅผ ์ถ๋ ฅํ๋ค.
๐ก ํผ๋๋ฐฑ
- ๋ ๊ฐ์ bfs๋ฅผ ์คํํ๋ค๊ณ ์๊ฐํ๋๊น ๋ณต์กํ๊ฒ ๋๊ปด์ก๊ณ ๊ทธ๋งํผ ์ค๋๊ฑธ๋ฆฐ ๋ฌธ์ ์๋ค.
- ๋ง์ ํ๊ณ ๋๋๊น ๊ทธ๋ฅ ์ง์ง ๋จ์ํ๊ฒ bfs ๋ ๊ฐ,,!๋ผ๊ณ ์๊ฐํ๋ฉด ํธํ ๊ฒ ๊ฐ๊ณ ,,
๋ค๋ง ์กฐ๊ธ ๊ณ ๋ คํด์ค์ผํ ์ ์ ์ผ๋ฐ์ ์ธ bfs ๋ฌธ์ ๋ค์ ๊ฒฝ์ฐ ํ๋์ ํ๋ฅผ ๊ฐ์ง๊ณ
๊ณ์ ํ์ํ ์๋ฆฌ๋ฅผ ๋ค์ ์ถ๊ฐํด๊ฐ๋ฉด์ ํ๊ฐ ๋น๋๊น์ง ๋ฐ๋ณต์ ์ํํ๋ค๋ฉด,
์ด ๋ฌธ์ ๋ ๋ ๊ฐ์ bfs๊ฐ ๋์์ ์ํ๋์ด์ผํ๋ฏ๋ก ๊ธฐ์กด์ ํ์ ๋ฐ๋ก
์๋ก์ด ํ์ ์๋ฆฌ๋ฅผ ์ถ๊ฐํ์ง ์๊ณ ์๋ก์ด ๋ฐฐ์ด์ ๋ชจ์๋๋ค๊ฐ,,!
๋ถ๊ณผ ์งํ์ด ๋๋ค ํ ๋ฒ์ ํด๋นํ๋ ์ด๋์ด ๋๋๋ฉด ๊ทธ ๋ ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ๋ฐ๋ณตํด์ผํ๋ค.
๋ฌธ์
'3๏ธโฃ Swift > Problem Solving' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift Algorithm] ์ ๊ธฐ๋ ๋ฐฐ์ถ BOJ #1012 (0) | 2021.10.05 |
---|---|
[Swift Algorithm] ์จ๋ฐ๊ผญ์ง BOJ #1697 (2) | 2021.10.05 |
[Swift Algorithm] ํ ๋งํ BOJ #7576 (0) | 2021.10.02 |
[Swift Algorithm] ๋ฏธ๋ก ํ์ BOJ #2178 (0) | 2021.10.01 |
[Swift Algorithm] ๊ทธ๋ฆผ BOJ #1926 (0) | 2021.09.30 |
๋๊ธ