์ญ์๋ ์ด๋ฌธ์ ๋ ๊ณจ๋๋ผ์ ๊ฒ๋จน์๋๋ฐ, ๋ฌธ์ ๋ฅผ ์ฐจ๊ทผ์ฐจ๊ทผ ์ฝ์ด๋๊ฐ๋ฉด์ ์์ดํจ๋์ ์๊ฐ์ ๋ฆฌ๋ฅผ ํด๋ณด๋ ์กฐ๊ฑด์ฒ๋ฆฌ๋ง ์ ํด์ฃผ๋ฉด ์ฌ์ด ๋ฌธ์ ์๋ค!
๊ทผ๋ฐ ์ค์ผ ๋ง์ด ํ๋ ธ๋๊ณ ? ํํใ ํํณ,,, ์ฝ๋ ์์ ํ๋๋ผ ๋ง printํด์ผํ๋๋ฐ ์ํด์ฃผ๊ณ print๋ฌธ ์ง์์ง์ง๋ ๋ชจ๋ฅด๊ณ ๋ค๋ฅธ๊ฑฐ ์์ ํ๊ณ ์์์๊ณ ์์๋ฅผ ํ๋ค. ... ์์ฐ ๊ทธ๋ฅ...... ๋ฌธ์ ๋ ๋ค ํ์๋๋ฐ ๋์ ์ ์ค์๋๋ฌธ์ ์ธ๋ฐ์์ด ๋ฒ๋ฆฐ ์๊ฐ๋ง ๋๋ฌด ๋ง์์ ํ๊ฐ ๋จ๋จํ ๋ฌ๋ ๋ฌธ์ !
โซ๏ธ ๋ฌธ์
https://www.acmicpc.net/problem/3055
โซ๏ธ ์๊ฐ์ ํ๋ฆ
์ด์ฐ,,, ๋ฌธ์ ์ฝ์๋ง์ ๋ญ์ด๋ฆฌ๋ง์?? ํ๋ฉด์ ์์ดํจ๋์ ๋์ ์ด๊ธฐ ์์ํ๋ค. ... ๋น๊ณณ๋ ์๊ณ ,, ๋น๋ฒ ๊ตด.. ๋ฌผ์ด์ฐจ์๋๊ณณใฑ.. ๋ฑ๋ฑ ์ฐ์ ์๊ฐ์ ํ๋ฆ์ ์ ๋ฆฌํด๋ณด์.
๐ ์ต์ ์๊ฐ์ ๊ตฌํ๋ผ๊ณ ??
์ ์ต์์๊ฐ์ ๊ตฌํ๋ ๊ฑฐ๊ตฌ๋! ์๊ฐ์ ํ์นธ ์ด๋ํ ๋ 1๋ถ์ด๋ผ๊ณ ์น๋ฉด ๋๋๊ตฌ๋! ๊ทธ๋ผ BFS๋ฅผ ์ด์ฉํด์ ์์๋ ธ๋~๋์ฐฉ๋ ธ๋๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ฉด ๋๊ฒ ๋ค? ๊ณ ์ด๋์น๊ฐ ์๋ ์์น๋ฅผ ์์๋ ธ๋๋ผ๊ณ ์น๊ณ , ๋น๋ฒ๊ตด์ด ์๋ ๋ ธ๋๋ฅผ ๋์ฐฉ๋ ธ๋๋ผ๊ณ ์ณ์ ๊ณ ์ด๋์น๋ฅผ ์ด๋์์ผ๋ณด์. ์ด๋ ๊ฒ ์๊ฐ์ ํ๋ฆ์ ๊ฐ์ ธ๊ฐ๋ค.
๐ ๊ทธ๋ ๋ค๋ฉด BFS๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํ ์ ์์๊น?
BFS๋ ์์๋ ธ๋, ๊ทธ๋ฆฌ๊ณ ๊ทธ์ ์ธ์ ํ ๋ ธ๋๋ฅผ ๋ชจ๋ queue์ ๋ฃ์ด์ฃผ๋ฉด์ ์ด๋ค ๋ ธ๋๊น์ง๊ฐ ์ต๋จ๊ฑฐ๋ฆฌ์ผ์ง ์ฐพ๋ ๋ฐฉ์์ด๋ค. ๊ทธ๋ผ, queue์ ์ด๋ํ๋ ค๋ ์์น๊ฐ (x, y)๊ณผ depth๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋์ง์์๊น? depth์๋ BFS๋ด๋ถ์์ ๋ช๊ฐ์ ๊ฐ์ ์ ์ง๋ฌ๋์ง ์ ์ด์ฃผ์. ๊ทธ๋ผ ์ด๊ฒ ์๊ฐ์ด ๋๊ฒ ๋ค?
๐ BFS๋ฅผ ์ง๊ธฐ์ ์ ๊ทธ๋ผ ์๊ฐ๋ณต์ก๋ ๋จผ์ ์ดํด๋ณด์
BFS๋ ํ๊ฐ์ ๋ ธ๋๋น N๋ฒ์ for loop๋ฅผ ๋๊ฒ ๋๊ธฐ ๋๋ฌธ์ O(N)์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์์๋๋ค. ํ์ง๋ง, ์ฌ๊ธฐ์ ๋ queue ๋ด๋ถ์ ์๋ฌด๊ฒ๋ ์์ ๋๊น์ง while ๋ฐ๋ณต๋ฌธ์ ๋๊ธฐ ๋๋ฌธ์ O(N^2)์ด ์์๋๋ค.
N์ ๋ฒ์๋? 50๋ณด๋ค ์์์๋ค! ์,,, ์ต๋๋ก ๋์๊ฐ๋ 2500๋ฒ์ด๊ธฐ ๋๋ฌธ์ BFS๋ก ๊ตฌํํ๋๊ฑฐ ์๊ฐ๋ฅ์ด๊ฒ๊ณ ๋ง!
๐ ๊ทธ๋ผ ์ด์ !! BFS๋ฅผ ์๋์ฝ๋๋ก ๊ตฌํํด๋ณด์
๋ค์ ์๊ฐ์ ๋ฌผ์ด ์ฐจ๋ ๊ณณ์ ๊ณ ์ด๋์น๊ฐ ์์ง์ด์ง ๋ชปํ๋ค๊ณ ํ๋ค. ๊ทธ๋ผ, ๋ฌผ์ ๋จผ์ ์ฑ์์ฃผ๊ณ , ๊ทธ๋ค์ ๊ณ ์ด๋์น๋ฅผ ์์ง์ฌ์ฃผ๋ฉด ๋๊ฒ ๊ตฌ๋! ๋ผ๊ณ ์๊ฐํ๋ฐ. ๊ทธ๋ ๊ฒ ๋์ถฉ ์ฝ๋๋ฅผ ์ง๋ณธ๊ฒ ์๋์ ๊ฐ๋ค.
์ฒ์์ ์๊ฐํ ๋ฐฉ์์ while๋ฌธ ๋ด๋ถ์์ *(๋ฌผ)์ ์์น๋ฅผ ์ฐพ์์ฃผ๊ณ , ๋ฌผ ์ฌ๋ฐฉ์ ๋ค ๋ฌผ๋ก ๋ฎ์ด๋ฒ๋ฆฐ ํ, ๊ณ ์ด๋์น๋ฅผ ์ฌ๋ฐฉ์ผ๋ก ์ด๋์ํค๋ ๋ฐฉ์์ด์๋ค. ์ด๋ ๊ฒ ๊ทธ๋๋ก ์ฝ๋๋ฅผ ๊ตฌํํ๋๋ฐ,,, ๋น์ฐํ ํ๋ฆฌ๊ณ ๋ง์๋ฐ! ์ ํ๋ ธ๋!!!
โ ํ๋ ธ์ต๋๋ค (1)
ํ๋ ธ์๋, ๋จธ๋ฆฌ๋ก๋ ๋์ ํ ์ฝ๋ ์์ ์ ๋ชปํ ๊ฒ ๊ฐ์์ queue๊ฐ ๋์ด๋๋ ๋ฐฉ์, ๋ฌผ์ ์ด๋์ ์ฐจ๋์ง ์ ๋ถ print๋ก ์ฐ์ด๋ดค๋ค. ๋ฌธ์ ๋ ๋ฐ๋ก ์ฐพ์ ์ ์์๋ค.
์ง๊ธ ๋ด ์๋์ฝ๋๋ฅผ ๋ณด๋ฉด, while๋ฌธ์์ queue๋ฅผ ํ๋์ฉ ์ถ๋ ฅํ ๋๋ง๋ค ๋ฌผ์ ์ฑ์์ฃผ๊ณ ์๋ค.
ํ์ง๋ง ๋ง์ฝ ์ธ์ ํ ๋
ธ๋๊ฐ ๋ง์์ queue ์ [2, 0, 1] , [2, 1, 1] ์ด๋ ๊ฒ ์์ฌ์๋ค๊ณ ์๊ฐํด๋ณด์. (x, y, depth ์) ์ฒ์์ [2, 0, 1]์ด pop ๋์์ ๋ depth ๋ 1์ด๋ค. ์๊ฐ์ด 1์ด ์ง๋ฌ์๋์ ๋ฌผ์ด ์ฑ์์ง ํํ์ฌ์ผํ๋ค. ๋ค์ queue๊ฐ pop๋์์๋๋ ๋ง์ฐฌ๊ฐ์ง๋ก depth๊ฐ 1์ด๊ธฐ ๋๋ฌธ์ ๋์ผํ ๋ฐฐ์ด์ ์ฌ์ฉํด์ผํ๋๋ฐ, ์ฌ๊ธฐ์ ๋๋ ๋! ๋ฌผ์ ์ฑ์์ค ๊ฒ์ด๋ค.
๐ ๊ทธ๋ผ ์ด๋ป๊ฒ depth๋ณ๋ก ๋ฌผ์ ์ฑ์์ฃผ์ง??
์ฒ์์ ๋ฐ๋ณด๊ฐ์ด depth๊ฐ 1์ด๋ฉด for๋ฌธ์ผ๋ก 1๋ฒ ๋๋ ค์ ์ด๊ธฐ ์ ๋ ฅ๋ฐ์ arr๋ก๋ถํฐ ๋ฌผ์ 1๋ฒ ์ฑ์์ฃผ๊ณ , depth๊ฐ 2์ด๋ฉด ๋ ์ด๊ธฐ ์ ๋ ฅ๋ฐ์ arr๋ก๋ถํฐ for๋ฌธ์ depth๋งํผ ๋๋ ค์ ๋ฌผ์ 2๋ฒ ์ฑ์์ฃผ๊ณ .. ์ด๋ ๊ฒ ์๊ฐํ๋ค. ์ง์ง ในใ 1์ฐจ์์ ์ธ ์๊ฐ ใ ใ ใ ใ ใ ใ
๋น์ฐํ xcode ๋ด๋ถ์์๋ ๊ฒฐ๊ณผ๊ฐ์ด ๊ต์ฅํ ์ค๋ ๊ฑธ๋ฆฌ๋๋ก ๋์ค์ง ์๋ ์์ฒญ๋ ์๊ฐ์ ์ก์๋จน์๋ฐ. ๊ทธ๋์ ์๊ฐํ๊ฒ....
queue๋ฅผ ์์ธํ ๋ณด๋ฉด, depth ์์๋๋ก queue์ ์์ด๊ฒ ๋๋ค.
์ด๋ ๊ฒ ํ๋ฅผ print ํด๋ดค๋๋ฐ,, depth๋ 0, 0, 1,1,1,1,2,2,2,2,,,, ์ด๋ ๊ฒ ํ๋์ฉ ์ปค์ง๋ฉด์ queue์ ์์ด๊ฒ ๋๋ค. ๊ทธ๋์!! ํ๋จํ๊ฒ, depth๊ฐ ์ด์ ๊ฐ๊ณผ ๋ฌ๋ผ์ง๋ฉด? ๋ฌผ์ ์ฑ์๋ผ!~ ์ด๋ ๊ฒ ๋ฐ๊ฟจ๋ค.
// ์ด์ฐจํผ depth๋ ์์๋๋ก ์ฆ๊ฐ -> ๋ณํ๋ฉด ํ๋ ๋ฌผ์ฑ์์ง ์ง๋๋ก ์ฌ์ฉ
if waterfillCount != depth {
waterfillCount = depth
fillwater()
}
โ ์๊ฐ์ด๊ณผ (1)
์ ์ ๋ ์๊ฐ์ด๊ณผ!! ์ค๊น.... ์์.... ๋ค์ ์์ queue๋ฅผ ๋ณด์.
์ฌ๊ธฐ ๋๋๊ทธ ํด๋์๋ฐ๋ฅผ ๋ณด๋ฉด,, queue ๋ด๋ถ์ ๋์ผํ ๋ ธ๋๊ฐ ๋ค์ด์๋ค! ์๋๋ฉด,,, ๋ด๊ฐ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ง ์์์ ๊ทธ๋ ๋ค. ์ด๋ฐ์๋ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ง ์์๋ ๋๋ค๊ณ ์๊ฐํ๋ค. ์๋๋ฉด? ์๋ค๊ฐ ๋๋์๊ฐ๋ route๋ฉด, ์ด์ฐจํผ depth๊ฐ ํ๋จ๊ณ ์ปค์ง๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ๊ฐ์๋ ํฌ๊ฒ ์ํฅ์ ์ฃผ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทผ๋ฐ,, ์ด๋ ๊ฒ ํ๊ฒ ๋๋ฉด queue๊ฐ ๋ฌด์ง๋ง์งํ๊ฒ ์ปค์ง๊ฒ ๋๊ณ , queue๋ด๋ถ์์ popํ๋ ํ์๊ฐ ๋ ๋์ด๋๊ธฐ ๋๋ฌธ์ ๋ ๋ง์ ์๊ฐ์ ์์ํ๋ค.
BFS๋ queue ๋ด๋ถ์์ ์ก์๋จน๋ ๊ณต๊ฐ๋ณต์ก๋๊ฐ ์๊ฐ์ ํฌ๊ฒ ์ํฅ์ ์ค๋ค๋ ์ฌ์ค์ ์์๋ค... ์๋ ๊ณ ์ ์์์ด???
ํ๋ฒ ๋ฐฉ๋ฌธํ ๋ ธ๋๋ ๋ ๋ฐฉ๋ฌธํ์ง ์๋๋ค! ๋ผ๋ ์กฐ๊ฑด์ด ์์ง๋ง, ์๋ค๊ฐ ๋๋์๊ฐ๋ ๋ฃจํธ๋ ์ด์ฐจํผ ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ visited๋ผ๋ ๋ฐฐ์ด์ ํ๋ ๋ง๋ค์ด์ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๊ณ , ์ด๋ฐ์ผ์ด ์๊ฒ ๋ง๋ค์ด์ฃผ์.... ๊ทธ๋์ผ... ์๊ฐ์ด ์กฐ๊ธ์ด๋ผ๋ ๋๋ค์ง.. ํ..
๊ทธ ๊ฒฐ๊ณผ,,, ํต๊ณผ ๐ฅฐ ์ด์ฐ.. ์๊ฐ์ ๋๋ฌด ๋ฒ๋ ธ์ด์ ๋๋ฌด ๊ธฐ๋ปค๋ค.... (์ปดํ์ผ ์๋ฌ๋ ๋ณ์ ๋ช ์คํ๋์ ๐ )
โซ๏ธ ์ ๋ต์ฝ๋
์ ๊ทธ๋ฆฌ๊ณ , ์ฝ๋ ๋ณด๋ฉด fillwater ํจ์ ๋ด๋ถ์์ removefirst ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ์ธ๋ฐ์์ด ์๊ฐ์ ์ก์๋จน๊ณ ์๋๋ฐ, ์ด๊ฒ๋ ๊ฐ์ ํด์คฌ๋ค! (์ฝ๋๋ ๊ทธ๋๋ก ์ฃผ์๋ฌ์์ ์๋ ์ ์ด๋จ๋ค.)
import Foundation
let rc = readLine()!.split(separator: " ").map{ Int($0)! }
var maps = [[String]]()
var start = [0, 0]
var end = [0, 0]
var water = [[Int]]()
for i in 0..<rc[0] {
let temp = readLine()!.map{ String($0) }
if temp.contains("D") {
end = [i, temp.firstIndex(of: "D")!]
}
if temp.contains("S") {
start = [i, temp.firstIndex(of: "S")!]
}
for t in temp {
if t == "*" {
water.append([i, temp.firstIndex(of: t)!])
}
}
maps.append(temp)
}
var visited = Array(repeating: Array(repeating: false, count: rc[1]), count: rc[0])
let dx = [-1, 1, 0, 0]
let dy = [0, 0, -1, 1]
func bfs() {
var flag = false
var queue = [[Int]]() // [x, y, depth]
queue.append([start[0], start[1], 0])
visited[start[0]][start[1]] = true
var waterfillCount = -999
while !queue.isEmpty {
// ๊ณ ์ด๋์น S ์ด๋์์ผ์ฃผ๊ธฐ
let q = queue.removeFirst()
let x = q[0]
let y = q[1]
let depth = q[2]
// ์ด์ฐจํผ depth๋ ์์๋๋ก ์ฆ๊ฐ -> ๋ณํ๋ฉด ํ๋ ๋ฌผ์ฑ์์ง ์ง๋๋ก ์ฌ์ฉ
if waterfillCount != depth {
waterfillCount = depth
fillwater()
}
if x == end[0], y == end[1] {
print(depth)
flag = true
break
}
for i in 0..<4 {
let nx = x + dx[i]
let ny = y + dy[i]
if nx < 0 || ny < 0 || nx >= rc[0] || ny >= rc[1] {
continue
}
// ๋์ด๊ฑฐ๋ ๋ฌผ์ด๋ฉด pass
if maps[nx][ny] == "X" || maps[nx][ny] == "*" {
continue
}
// maps์์ ๋น์ด์๋๊ณณ์ด๋ฉด, ํ์ ๋ฃ์ด์ค์ผ๋ก์จ ์ธ์ ๋
ธ๋๋ก ์ถ๊ฐ
// visited ๊ผญํด์ค์ผ ์๊ฐ์ด๊ณผ ์๋จ ;
if (maps[nx][ny] == "." || maps[nx][ny] == "D"), !visited[nx][ny] {
visited[nx][ny] = true
queue.append([nx, ny, depth + 1])
}
}
}
if !flag {
print("KAKTUS")
}
}
// ๋ฌผ์ ์ฑ์์ฃผ๋ ํจ์
// ์ด์ฐจํผ water ๋ด๋ถ์์๋ง ์์๋๋ก ๋๋ฆฌ๋ฉด๋ผ
// ๊ทธ๋ฆฌ๊ณ temp๋ก ๊ฐฑ์ ์์ผ์ฃผ์... O(N^2) -> O(N) ์๊ฐ๋ฅ (์ด์ง๋ง ๋๋ฒ์งธ ์๋๋ ์๊ฐ์ด๊ณผ๊ฐ ๋๊ณ ๋ง์๋ค)
func fillwater() {
var temp = [[Int]]()
for w in water {
let waterX = w[0]
let waterY = w[1]
for i in 0..<4 {
let nwx = waterX + dx[i]
let nwy = waterY + dy[i]
if nwx < 0 || nwy < 0 || nwx >= rc[0] || nwy >= rc[1] {
continue
}
if maps[nwx][nwy] == "." {
maps[nwx][nwy] = "*"
temp.append([nwx, nwy])
}
}
}
water = temp
}
// โ ์ฒซ๋ฒ์งธ ์๋ -> ์๊ฐ์ด๊ณผ
// ๋ฌผ ์ด๋์ํค๋๊ฑฐ -> maps ๋ง ๋ณํ์์ผ์ฃผ๋ฉด ๋๋๋ฐ ์ธ๋ฐ์์ด removeFirst์กฐ์ง๊ณ ์์์
func timeover_fillwater() {
let waterCnt = water.count
var maps = maps
for _ in 0..<waterCnt {
let waterPlace = water.removeFirst()
let waterX = waterPlace[0]
let waterY = waterPlace[1]
for i in 0..<4 {
let nwx = waterX + dx[i]
let nwy = waterY + dy[i]
if nwx < 0 || nwy < 0 || nwx >= rc[0] || nwy >= rc[1] {
continue
}
if maps[nwx][nwy] == "X" || maps[nwx][nwy] == "*" {
continue
}
maps[nwx][nwy] = "*"
water.append([nwx, nwy])
}
}
}
bfs()
'Algorithm > Baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] (Swift) 1941๋ฒ - ์๋ฌธ๋ ์น ๊ณต์ฃผ (๊ณจ๋3) (DFS) (2) | 2023.03.04 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] (Swift) ๋จ์ด๋ณํ (LV.3) (DFS) (1) | 2023.03.03 |
[๋ฐฑ์ค] (Swift) 10026๋ฒ - ์ ๋ก์์ฝ (๊ณจ๋5) (DFS) (0) | 2023.03.03 |
[๋ฐฑ์ค] (Swift) 14716๋ฒ - ํ์๋ง (์ค๋ฒ1, DFS) (0) | 2023.02.28 |
[๋ฐฑ์ค] (Swift) 3184๋ฒ - ์ (์ค๋ฒ1) (DFS) (1) | 2023.02.28 |