[๋ฐฑ์ค] (Swift) 3184๋ฒ - ์ (์ค๋ฒ1) (DFS)
์น๊ตฌ์ DFS / BFS์ ๋ํ ๊ณ ์ฐฐ์ ํ ํจ๊ณผ๋ฅผ ํกํกํ ๋ณด๋๊ฑธ๊น? ์ด์ DFS์ BFS๋ฅผ ๋ช ํํ๊ฒ ๊ตฌ๋ณํ ์ค ์๊ณ ๋ฌธ์ ๊ฐ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ํ๋ฆฐ๋ค..!
โซ๏ธ ๋ฌธ์
https://www.acmicpc.net/problem/3184
3184๋ฒ: ์
์ฒซ ์ค์๋ ๋ ์ ์ R๊ณผ C๊ฐ ์ฃผ์ด์ง๋ฉฐ(3 ≤ R, C ≤ 250), ๊ฐ ์๋ ๋ง๋น์ ํ๊ณผ ์ด์ ์๋ฅผ ์๋ฏธํ๋ค. ๋ค์ R๊ฐ์ ์ค์ C๊ฐ์ ๊ธ์๋ฅผ ๊ฐ์ง๋ค. ์ด๋ค์ ๋ง๋น์ ๊ตฌ์กฐ(์ธํ๋ฆฌ, ์, ๋๋์ ์์น)๋ฅผ ์๋ฏธํ๋ค.
www.acmicpc.net
โซ๏ธ ๋์ ํ์ด
์์ ํ์๋ DFS ๋ฌธ์ ์ ํ๊ณผ ๊ณ์ ๋น์ทํ๊ธฐ ๋๋ฌธ์ ์์ํ๊ฒ ํ์ด๋ฅผ ์๊ฐํด๋๋ค. ๊ทธ๋ฆฌ๊ณ ์น๊ตฌ์ ์ด์ผ๊ธฐ ๋๋ด๋ ๋ถ๋ถ์ ์ ์๊ฐํ๋ฉด์ ํธ๋๊น ๊ธ๋ฐฉ ํ๋ฆฐ๋ค.. ์ฌ๋ ์ฌ๋
์์ญ๋ง๋ค ์๊ณผ ๋๋์ ์๋ฅผ ๋ฐ๋ก ์ธ์ด์ค์ผํ๊ธฐ ๋๋ฌธ์, for ๋ฌธ์ ๋๋ ค์ ์์ญ๋ณ๋ก ํ์ํด์ฃผ์ด์ผํ๋ค๊ณ ์๊ฐํ๋ค. ์์ญ๋ง๋ค ํ์์ ๋ง์น๋ฉด ์ ๋ถ # (์ธํ๋ฆฌ)๋ก ๊ฐ์ ๋ฐ๊ฟ์ฃผ๋ฉด์ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ์์ญ๋ง๋ค ์๊ณผ ๋๋์ ์๋ฅผ ๋น๊ตํด์ ์ด answer์ ๊ตฌํด์ฃผ์๋ค.!
๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ ์๋์ฒ๋ผ ๊ทธ๋ฆผ์ ๊ทธ๋ ธ๋ค.
์ด๊ฒ์ ๊ทธ๋๋ก ์ฝ๋๋ก ์ฎ๊ธฐ๋ฉด ์๋์ ๊ฐ์ด ์ ๋ต์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค!
โซ๏ธ ์ ๋ต์ฝ๋
import Foundation
let rc = readLine()!.split(separator: " ").map{ Int($0)! }
var field = [[String]]()
for _ in 0..<rc[0] {
field.append(readLine()!.map{ String($0) })
}
let dx = [-1, 1, 0, 0]
let dy = [0, 0, -1, 1]
var oCnt = 0
var vCnt = 0
var answer = [0, 0]
private func dfs(x: Int, y: Int) {
switch field[x][y] {
case "o":
oCnt += 1
case "v":
vCnt += 1
default:
break
}
field[x][y] = "#"
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
}
if field[nx][ny] != "#" {
dfs(x: nx, y: ny)
}
}
}
for i in 0..<rc[0] {
for j in 0..<rc[1] {
if field[i][j] != "#" {
oCnt = 0
vCnt = 0
dfs(x: i, y: j)
if vCnt >= oCnt {
answer[1] += vCnt
} else {
answer[0] += oCnt
}
}
}
}
print("\(answer[0]) \(answer[1])")