๊ณจ๋์ฌ์ ๊ฒ๋จน์๋๋ฐ ์กฐ๊ฑด์ฒ๋ฆฌ๋ง ์ ํด์ฃผ๋ฉด ์์ฃผ ์ฌ์ด ๋ฌธ์ ์๋น!
โซ๏ธ ๋ฌธ์
https://www.acmicpc.net/problem/10026
โซ๏ธ ๋์ ๊ณ ๋ฏผ,,, ํ์ด
๋ฌธ์ ๋ฅผ ์ฝ์๋ง์ ์ด๋ป๊ฒ ํ์ด์ผํ ์ง ํ์ ํ์ง๋ง,, , ๋์์ ๊ณ ๋ฏผ์ด ๋ค์๋ ๊ฒ์ด ์๋ค. ์ ๋ก์์ฝ์ธ๊ฒฝ์ฐ์, ์ ๋ก์์ฝ์ด ์๋ ๊ฒฝ์ฐ๋ฅผ ๋ฐ๋ก dfs๋ฅผ ๋๋ ค์ฃผ์ด์ผํ ๊น? ๊ทธ๋ ๊ฒ ํ๊ฒ ๋๋ค๋ฉด,,, ์๊ฐ์ด ๋๋ฌด ์ค๋๊ฑธ๋ฆฌ์ง ์์๊น? ์ถ์๋ค. ๊ทธ๋์ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ํ๋ฉด ๊น๋ํ๊ฒ ์งค ์ ์์๊น, DFS๋ฅผ ํ ๋ฒ๋ง ๋๋ฆฌ๋ฉด์ ๋๋ง๋ฆฌ ํ ๋ผ๋ฅผ ๋ชจ๋ ์ก์ ์ ์์์ง ๊ณ ๋ฏผํ๋ค.
๐ ์๊ฐ๋ณต์ก๋ ๋จผ์ ๋ตํฌํด๋ณด์
๋ฐฐ์ด์ ๋ฌด์กฐ๊ฑด NxN ์ผ๋ก ์ฃผ์ด์ง๋ค. ๊ทธ๋ฆฌ๊ณ , N์ ์ต๋ ๊ฐ์ 100์ด๋ค. DFS ํ๋๋น N๋ฒ์ loop๋ฅผ ๋๊ธฐ ๋๋ฌธ์ O(N)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ง, ์ ๋ถ ๋ฐฉ๋ฌธํ๋ฉด์ ํ์ํด์ฃผ์ด์ผํ๋๊น O(N^2)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค. ์ต๋ ๊ทธ๋ผ 10000๋ฒ์ loop๋ฅผ ๋๊ฒ ๋๋๋ฐ, ์ด์ ๋๋ ๋ฌด๋ฆฌ ์์ด ๋์๊ฐ ๊ฒ ๊ฐ์๊ณ , DFS๋ฅผ ์ฑํํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค. (DFS๋ฅผ ๋๋ฒ ๋๋ ค๋ ๊ฒฐ๊ตญ ๋น ์คํ๊ธฐ๋ฒ์์ O(N^2)์ด๋ฏ๋ก ๋๋ฒ๋๋ ค๋ ๋ฌด๋ฆฌ์์ด ๋์๊ฐ๊ฒ ๊ฐ์๋ค.)
๐ ์ฒ์ ์๊ฐํ ๋ฐฉ์
์,, ์ฐ์ ์ฒ์์ ์๊ฐํ ๋ฐฉ์์ ์ฒ์์ ์ ๋ ฅ๋ฐ๋ picture์ ๋๊ฐ์ง๋ก ์ ์ฅํ๋ ๋ฐฉ์์ด์๋ค. G๊ณผ R๋ฅผ ํ๋๋ก ํต์ผ์ํจ ์ ๋ก์์ฝ ์ ์ฉ picture ๋ฐฐ์ด๊ณผ, ๊ทธ๋ฅ ์ ๋ ฅ๋ฐ์ picture ๋ฐฐ์ด ์ด๋ ๊ฒ ๋๊ฐ์ง๋ฅผ ๋ง๋ค์ด์, DFS๋ฅผ ๋๋ฒ ๋๋ฆฌ๋ ๋ฐฉ์์ ์ฒ์์ ์๊ฐํ๋ค. ๊ทผ๋ฐ.. ๋ญ๊ฐ ๋ง์ ์๋ค์ด! ๋ ์์ง๊ณ ์ถ์ ๋ง์์ด ๋ค์๋ค.
๐ ๊ณ ๋ฏผํ๋ค๊ฐ ๊ฒฐ๊ตญ ์ฑํํ ๋ฐฉ์
๊ณ ๋ฏผํ๋ค๊ฐ ๊ฒฐ๊ตญ dfs๋ฅผ ๋๋ฒ ๋๋ฆฌ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค. ์๋๋ฉด, pictrue๋ฐฐ์ด์ ๋๊ฐ ๋ง๋ค์๋๋ผ๋, ์ํฉ์ ๋ฐ๋ผ ๋ถ๊ธฐ์ฒ๋ฆฌ๋ฅผ ๋ฐ๋ก ํด์ ์ฌ๊ท๋ฅผ ๋๋ ค์ค์ผํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ง๋ ํ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์๊ฐ๋์ง ์์์, dfs๋ฅผ ๋๋ฒ ๋๋ฆฌ๊ธฐ๋ก ํ๋ค... ๊ทธ๋,, dfs๋๋ฒ ๋๋ ค๋ ๋ฌด๋ฆฌ๊ฐ ์๋๋ก ์กฐ๊ฑด์ ์ ๋ ๊ฒ ์ฃผ์ด์คฌ๊ฒ ์ง,, ๊ทธ๋ฆฌ๊ณ ํญ์ ์กฐ๊ฑด์ ์ ๋ ๊ฒ ์ค ์ด์ ๊ฐ ์๊ฒ ์ง! ํ๊ณ ์๊ฐํ๋ฉด ??? ๋๋ฒ ๋๋ฆฌ๋๊ฒ ๊ทธ๋ ๋ง๊ฒ ๋ค!!
๐ ์ฝ๋ ๊ตฌํ
main์ผ๋ก ๋์๊ฐ๋ ๋ถ๋ถ์์ 2์ค for loop๋ฅผ ์ฌ์ฉํด์ ๋ชจ๋ ๋ ธ๋๋ฅผ ํ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ , ๊ทธ ๋ด๋ถ์์ dfs๋ฅผ ๋๋ฒ ๋๋ ธ๋ค! ๊ทธ๋ฆฌ๊ณ , dfs ์ฝ๋๋ ๋๋ฒ ์์ฑํ๋ฉด ๋นํจ์จ์ ์ผ ๊ฒ ๊ฐ์์, enum์ผ๋ก type์ ๋ฐ๋ก ๋ง๋ค์ด์ค ๋ค, ๋ถ๊ธฐ์ฒ๋ฆฌ๋ก type๊น์ง ํจ๊ป ๋๊ฒจ์ฃผ์๋ค.
dfs ๋ด๋ถ ์ฝ๋๋ ์ฝ๊ฐ ๋น์ทํ ํํ๋ก ๋ฐ๋ณต๋๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ๋ ๊น๋ํ๊ฒ ์งค ์ ์์์ง ๊ณ ๋ฏผํ์ง๋ง,, ์ผ๋จ,, ๊ทธ๋ ์ผ๋จ ์ฌ๊ธฐ์ ๋...
โซ๏ธ ์ ๋ต์ฝ๋
import Foundation
let n = Int(readLine()!)!
var picture = [[String]]()
for _ in 0..<n {
picture.append(readLine()!.map{ String($0) })
}
var redGreenDiseaseVisited = Array(repeating: Array(repeating: false, count: n), count: n)
var nonDiseaseVisited = Array(repeating: Array(repeating: false, count: n), count: n)
var answer = [0, 0]
// ์ ํ ์ข ์ฐ
let dx = [-1, 1, 0, 0]
let dy = [0, 0, -1, 1]
enum type {
case redGreenDisease
case nonDisease
}
private func dfs(x: Int, y: Int, type: type) {
switch type {
case .redGreenDisease:
redGreenDiseaseVisited[x][y] = true
let now = picture[x][y]
for i in 0..<4 {
let nx = x + dx[i]
let ny = y + dy[i]
if nx < 0 || ny < 0 || nx >= n || ny >= n {
continue
}
if now == "G" || now == "R" {
if picture[nx][ny] == "G" || picture[nx][ny] == "R", !redGreenDiseaseVisited[nx][ny] {
dfs(x: nx, y: ny, type: .redGreenDisease)
}
} else {
if picture[nx][ny] == now, !redGreenDiseaseVisited[nx][ny] {
dfs(x: nx, y: ny, type: .redGreenDisease)
}
}
}
default:
nonDiseaseVisited[x][y] = true
let now = picture[x][y]
for i in 0..<4 {
let nx = x + dx[i]
let ny = y + dy[i]
if nx < 0 || ny < 0 || nx >= n || ny >= n {
continue
}
if now == picture[nx][ny], !nonDiseaseVisited[nx][ny] {
dfs(x: nx, y: ny, type: .nonDisease)
}
}
}
}
// main : ๋ชจ๋ ๋
ธ๋ ํ์
for i in 0..<n {
for j in 0..<n {
if !nonDiseaseVisited[i][j] {
answer[0] += 1
dfs(x: i, y: j, type: type.nonDisease)
}
if !redGreenDiseaseVisited[i][j] {
answer[1] += 1
dfs(x: i, y: j, type: type.redGreenDisease)
}
}
}
print("\(answer[0]) \(answer[1])")
'Algorithm > Baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] (Swift) ๋จ์ด๋ณํ (LV.3) (DFS) (1) | 2023.03.03 |
---|---|
[๋ฐฑ์ค] (Swift) 3055๋ฒ - ํ์ถ (๊ณจ๋4) (BFS) (0) | 2023.03.03 |
[๋ฐฑ์ค] (Swift) 14716๋ฒ - ํ์๋ง (์ค๋ฒ1, DFS) (0) | 2023.02.28 |
[๋ฐฑ์ค] (Swift) 3184๋ฒ - ์ (์ค๋ฒ1) (DFS) (1) | 2023.02.28 |
[๋ฐฑ์ค] (Swift) 1743๋ฒ - ์์๋ฌผ ํผํ๊ธฐ (DFS) (4) | 2023.02.27 |