์ค๋์ ๋ฌธ์
- ๋ฐฑ์ค ์์ ์์ญ
- https://www.acmicpc.net/problem/2468
์ค๋์ ํ์ต ํค์๋
- BFS(๋๋น ์ฐ์ ํ์), DFS(๊น์ด ์ฐ์ ํ์)
- BFS + Queue
- DFS + Stack
BFS (๋๋น ์ฐ์ ํ์)
- ์ต๋จ ๊ฑฐ๋ฆฌ, ์ต์ ํ์, ์ต์ ๋น์ฉ ๊ฐ์ ์ต์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ ๋ ์์ฃผ ์ฌ์ฉ๋๋ค.
- ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํ ๋จ๊ณ์ฉ ํ์ํ๊ธฐ ๋๋ฌธ์ ์ต๋จ ๊ฑฐ๋ฆฌ ๋ฌธ์ ์์ ์ ๋ฆฌํ๋ค.
- Queue ๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ๋ ๋ฒจ ์์ผ๋ก ํ์ํ๊ธฐ ๋๋ฌธ์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์์ฐ์ค๋ฝ๊ฒ ๊ตฌํ ์ ์๋ค.
- ๊ทธ๋ํ์์ ์ฐ๊ฒฐ๋ ์์ญ์ ํ์ํ๋ ๋ฌธ์ ์์๋ ์ ์ฉํ๋ค.
- ์ฌ์ ๊ฐ์ ์ฐพ๊ธฐ, ๊ฐ์ผ๋ ์์ญ ๊ตฌํ๊ธฐ, ์์น ๋ ์์ญ ๊ตฌํ๊ธฐ ๋ฑ ..
DFS (๊น์ด ์ฐ์ ํ์)
- ๊ทธ๋ํ๋ ํธ๋ฆฌ์์ ํ ๋ฐฉํฅ์ผ๋ก ๋๊น์ง ํ์ํ ํ, ๋ค์ ๋์์ ๋ค๋ฅธ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ ๋ฐฉ์์ด๋ค.
- ํ ๋ฐฉํฅ์ผ๋ก ๊น์ด ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ "์ต์ ๊ฑฐ๋ฆฌ"๋ฅผ ๋ณด์ฅํ๊ธฐ ์ด๋ ต๋ค.
- ์คํ์ด๋, ์ฌ๊ท๋ฅผ ์ฌ์ฉํด์ ๊ตฌํ ๊ฐ๋ฅํ๋ค.
- ๊ฒฝ๋ก ๊ฐ์ ์ฐพ๊ธฐ, ์์ ํ์, ๋ฐฑํธ๋ํน(์ต์ ์ ์กฐํฉ ์ฐพ๊ธฐ) ๊ฐ์ ๋ฌธ์ ์ ๋ง์ด ์ฐ์ธ๋ค.
์ ๊ทผ ๋ฐฉ๋ฒ
BFS vs DFS
- ํด๋น ๋ฌธ์ ๋ ๊ทธ๋ํ์์ ์ฐ๊ฒฐ๋ ์์ญ (= ๋น๋ฌผ์ด ๋์น์ง ์๋ ์์ ์์ญ)์ ์ฐพ๊ธฐ ๋๋ฌธ์ BFS ๋ก ์ ๊ทผํ๋ค.
- BFS ๋ฅผ ์ฌ์ฉํ๋ฉด ํ ์์ญ์ ๋ชจ๋ ํ์ํ ํ์ ์๋ก์ด ์์ญ์ ์ฐพ์์ ํ์ํ ์ ์๋ค.
- DFS ๋ ๊ฐ๋ฅํ์ง๋ง, BFS ๋ ํ๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํ๊ธฐ ์ฝ๊ณ ์ง๊ด์ ์ด๋ค.
Queue
- Swift ์์๋ Queue ๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ์ง ์๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ List ๋ฅผ ํตํด ๊ตฌํํ๋ค.
- First In First Out ์ผ๋ก ๋์ํด์ผํ๊ธฐ ๋๋ฌธ์ ์ธ์๋ฅผ ๊บผ๋ผ๋๋ removeFirst() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
- Queue ๋ O(1) ์ด์ง๋ง List ์์๋ (n) ์ ์์ ์ด๋ค.
- ์ธ์๋ฅผ ์ถ๊ฐํ ๋์๋ append() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ณ , O(1) ์ ์์ ์ด๋ค.
๋ฌธ์ ํ์ด
func calculateSafeArea(n: Int, h: Int, originalMap: [[Int]]) -> Int {
var visitMap = originalMap
var queue = [(Int, Int)]() // ๊ฐ๊น์ด ๋
ธ๋๋ฅผ ๋จผ์ ๋ฐฉ๋ฌธํด์ผํด์ ์์๋ฅผ ๋ณด์ฅํด์ผํจ
var count = 0
let dy = [-1, 1, 0, 0]
let dx = [0, 0, -1, 1]
for y in 0..<n {
for x in 0..<n {
// ํ์ฌ ๋ฌผ์ ์ ๊ธฐ์ง ์๋ ์ง์
guard visitMap[y][x] > h else { continue }
count += 1 // ๋ฌผ์ ์ ๊ธฐ์ง ์๋ ์์ญ
visitMap[y][x] = 0 // ๋ค๋ฅธ ์ง์ ์์ ๋ฐฉ๋ฌธํ ๋ ์ด๋ฏธ ๋ฐฉ๋ฌธํ์์ ์ฒดํฌ
queue.append((y, x)) // ํ์ฌ ์ง์ ๋ถํฐ ์ํ์ข์ฐ๋ฅผ ์ฒดํฌํ๊ธฐ ์ํด ํ์ ์ถ๊ฐ
while queue.isEmpty == false {
let (cy, cx) = queue.removeFirst() // O(n)
for m in 0..<4 {
let ny = cy + dy[m]
let nx = cx + dx[m]
guard ny >= 0, ny < n, nx >= 0, nx < n, // index ์ฒดํฌ
visitMap[ny][nx] > h else { continue } // ์ฃผ๋ณ์ด ๋ฌผ์ ์ ๊ธฐ์ง ์๋ ์ง์ ์ธ์ง ์ฒดํฌ
visitMap[ny][nx] = 0
queue.append((ny, nx))
}
}
}
}
return count
}
func readInput() -> (Int, Int, [[Int]])? {
guard let input = readLine(), let n = Int(input) else { return nil }
var inputArray = [[Int]]()
var maxItem = Int.min
for _ in 0..<n {
guard let input = readLine() else { continue }
inputArray.append(input.compactMap {
guard let item = Int(String($0)) else { return nil }
maxItem = max(maxItem, item)
return item
})
}
return (n, maxItem, inputArray)
}
if let (n, maxHeight, originalMap) = readInput() {
var result = Int.min
for h in 0..<maxHeight {
let count = calculateSafeArea(n: n, h: h, originalMap: originalMap)
result = max(result, count)
}
print(result)
}
- ๋ฐ๋ก ๊ธฐ์ค์ผ๋ก ์ ๋ถ ์ฒดํฌํ๋๋ฐ ๊ฒฐ๊ณผ๊ฐ ํ๋ฆผ์ผ๋ก ๋์จ๋ค
์ค๋์ ํ๊ณ
- DFS, BFS ๊ธฐ๋ณธ์ ์ธ ๋ฌธ์ ๋ฅผ ๋ ํ์ด๋ณด๊ธฐ
- Deque (Double-ended Queue) ๋ฅผ ๊ตฌํํด๋ณด๊ธฐ
- Swift ์์๋ ArraySlice ๋๋ LinkedList ๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํ ์ ์๋ค.