๋ฐ์ํ
๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/14502
๐ ๋ฌธ์ ํ์ด ์์ด๋์ด
0๊ณผ 1๊ณผ 2๋ฅผ ๊ตฌ๋ณํด์ผํ๋ค๋ ์ ์ด ์ด๋ ค์ ๋ค. ์ญ์ ๊ณจ๋๋ ๋์๊ฒ ๋ฌด๋ฆฌ์ธ๊ฒ์ธ๊ฐ ใ
ใ
ใ
์ค๋ ฅ์ธ์ ๋์ด ๋๊ณ ๋ ์๋?
๊ณ ๋ฏผ๊ณ ๋ฏผ๊ณ ๋ฏผ ํ๋ค๊ฐ ๋์ ํ ๊ฐ์ด ์กํ์ง ์์์ ์ด๋ป๊ฒ ํ์๋ ์ฐธ๊ณ ๋ฅผ ํด๋ณด์๋๋ฐ ํ์ด ๋ฐฉ๋ฒ์ ๋ค์๊ณผ๊ฐ์๋ค.
- BFS๋ ์ด๋ป๊ฒ ๊ตฌํํ ๊น
- ๋ฐ์ด๋ฌ์ค๋ฅผ ํผ๋จ๋ฆฌ๋๊ฒ์ด ๋ชฉํ๊ธฐ๋๋ฌธ์ ๋ฐ์ด๋ฌ์ค๋ฅผ queue์ ๋ฃ์ด์ฃผ๊ณ , ์ฌ๋ฐฉ๋ฉด์ ์์นํ ๊ฐ์ด 0 ์ด๋ผ๋ฉด, 2๋ก ์ ๋ ฅํด์ฃผ๋ฉด์ BFS ๋ฅผ ๋๋ ธ๋ค. ์ฆ, BFS๋ฅผ ๋๋ฆฌ๋ฉด์ ๋ฐ์ด๋ฌ์ค๋ฅผ ์ ํํด์ฃผ์๋ค.
- ๋ฒฝ์ ๋ฑ ์ธ๊ฐ ์ธ์ธ ์ ์๋๋ฐ, ์ด๋ป๊ฒ ์ธ์ธ๊น
- ํ์ด์ฌ์ผ๋ก ํผ ํ์ด๋ค์ ๋๋ถ๋ถ ์กฐํฉ..?? ๋ญ ์จ๋ ๊ทธ collection์์ ์ ๊ณตํ๋ ๊ฒ์ผ๋ก ๋ฒฝ์ ์ธ์ธ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ค, ํด๋น ์์น์ ๋ฒฝ์ ์ธ๊ฐ ์์ ์๋์ ์ต๋๊ฐ์ ๊ตฌํ๋ค.
- ํ์ง๋ง swift๋ ์ด๋ฐ๊ธฐ๋ฅ์ด์์ด์ 3์คfor๋ฌธ์ ์ด์ฉํด์ 0์ธ ์์น๋ค์ ์ ๋ถ ํ์ํ๊ณ , ์ด์ค์ ์ธ๊ฐ์ ์์น๋ฅผ ๊ณจ๋ผ์ 1์ ๋ฃ์ด์ค๋ค์ฐจ๊ทผ์ฐจ๊ทผ bfs๋ฅผ ๋๋ ค์ฃผ์๋ค ^___^
- ํต์ฌ ํฌ์ธํธ๋, 0์ธ ์์น๋ฅผ Empty ๋ผ๋ ๋ณ์์ ๋ชจ๋ ๋ฃ์ด์ค ๋ค, ์์น 3๊ฐ์ ์กฐํฉ์ ๋ชจ๋ ๊ณ ๋ คํ์ฌ ์ ๋ถ ํ์ํด์ค๋ค๋ ์ ์ด ํฌ์ธํธ์๋ค.
๐ ์ ๋ต์ฝ๋
let nm = readLine()!.split(separator: " ").map { Int(String($0))! }
let n = nm[0] // ์ธ๋ก
let m = nm[1] // ๊ฐ๋ก
var lab = [[Int]]()
var empty = [(Int, Int)]()
var virus = [(Int, Int)]()
var max = 0
let dx = [-1, 1, 0, 0]
let dy = [0, 0, -1, 1]
for _ in 0..<n {
lab.append(readLine()!.split(separator: " ").map { Int(String($0))! })
}
for y in 0..<n {
for x in 0..<m {
if lab[y][x] == 0 {
empty.append((y, x))
} else if lab[y][x] == 2 {
virus.append((y, x))
}
}
}
// bfs
// ๋ฐ์ด๋ฌ์ค๋ฅผ ์ ํ์ํค๋ฉด์ bfs๋๋ ค์ค
func bfs(copyLab: Array<Array<Int>>) {
var bfsLab = copyLab // lab์ ๋ฐ๊ฟ๋ฒ๋ฆฌ๋ฉด ์๋๊ธฐ ๋๋ฌธ์ ๋ง์ง๋ง์ bfs๋๋ฆด ๋ copy ํด์ ๋๋ฆด ๊ฑฐ์
var queue = [(Int, Int)]()
var visited = Array(repeating: Array(repeating: false, count: m), count: n)
var cnt = 0
for i in 0..<virus.count {
queue.append(virus[i])
}
while !queue.isEmpty {
let yx = queue.removeFirst()
let y = yx.0
let x = yx.1
for i in 0..<4 {
let ny = y + dy[i]
let nx = x + dx[i]
// ๋ฒ์ ํ์ธํ๊ณ , 0 ์ด๋ฉด 2๋ก ๋ฐ๊พธ๋ฉด์ ๋ฐ์ด๋ฌ์ค ์ ํ์ํด, ๊ทธ๋ฆฌ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
if nx >= 0, ny >= 0, nx < m, ny < n {
if bfsLab[ny][nx] == 0, visited[ny][nx] == false {
queue.append((ny, nx))
visited[ny][nx] = true
bfsLab[ny][nx] = 2
}
}
}
}
// 0 ์ธ์ด์ฃผ๊ธฐ
for i in 0..<n {
cnt += bfsLab[i].filter { ($0) == 0 }.count
}
// max ๊ฐ ๊ฐฑ์ ํด์ฃผ๊ธฐ
if max < cnt {
max = cnt
}
}
// ์ ์ฒด ๋๋ฉด์ 1 ๋ฃ์ด์ฃผ๊ธฐ
for i in 0..<empty.count {
for j in 0..<i {
for k in 0..<j {
let y1 = empty[i].0
let x1 = empty[i].1
let y2 = empty[j].0
let x2 = empty[j].1
let y3 = empty[k].0
let x3 = empty[k].1
lab[y1][x1] = 1
lab[y2][x2] = 1
lab[y3][x3] = 1
let newLab = lab
bfs(copyLab: newLab)
lab[y1][x1] = 0
lab[y2][x2] = 0
lab[y3][x3] = 0
}
}
}
print(max)
๐ Reference
์๋ ํ์ด๋ฅผ ์ฐธ๊ณ ํ์ด๋๋ค์
๋ฐ์ํ