[Swift Algorithm] ์ ๊ธฐ๋ ๋ฐฐ์ถ BOJ #1012
๋ฌธ์ ์ค๋ช
์ฐจ์ธ๋ ์๋์ธ ํ๋๋ ๊ฐ์๋ ๊ณ ๋ญ์ง์์ ์ ๊ธฐ๋ ๋ฐฐ์ถ๋ฅผ ์ฌ๋ฐฐํ๊ธฐ๋ก ํ์๋ค. ๋์ฝ์ ์ฐ์ง ์๊ณ ๋ฐฐ์ถ๋ฅผ ์ฌ๋ฐฐํ๋ ค๋ฉด ๋ฐฐ์ถ๋ฅผ ํด์ถฉ์ผ๋ก๋ถํฐ ๋ณดํธํ๋ ๊ฒ์ด ์ค์ํ๊ธฐ ๋๋ฌธ์, ํ๋๋ ํด์ถฉ ๋ฐฉ์ง์ ํจ๊ณผ์ ์ธ ๋ฐฐ์ถํฐ์ง๋ ์ด๋ฅผ ๊ตฌ์ ํ๊ธฐ๋ก ๊ฒฐ์ฌํ๋ค. ์ด ์ง๋ ์ด๋ ๋ฐฐ์ถ๊ทผ์ฒ์ ์์ํ๋ฉฐ ํด์ถฉ์ ์ก์ ๋จน์์ผ๋ก์จ ๋ฐฐ์ถ๋ฅผ ๋ณดํธํ๋ค. ํนํ, ์ด๋ค ๋ฐฐ์ถ์ ๋ฐฐ์ถํฐ์ง๋ ์ด๊ฐ ํ ๋ง๋ฆฌ๋ผ๋ ์ด๊ณ ์์ผ๋ฉด ์ด ์ง๋ ์ด๋ ์ธ์ ํ ๋ค๋ฅธ ๋ฐฐ์ถ๋ก ์ด๋ํ ์ ์์ด, ๊ทธ ๋ฐฐ์ถ๋ค ์ญ์ ํด์ถฉ์ผ๋ก๋ถํฐ ๋ณดํธ๋ฐ์ ์ ์๋ค. ํ ๋ฐฐ์ถ์ ์ํ์ข์ฐ ๋ค ๋ฐฉํฅ์ ๋ค๋ฅธ ๋ฐฐ์ถ๊ฐ ์์นํ ๊ฒฝ์ฐ์ ์๋ก ์ธ์ ํด์๋ ๊ฒ์ด๋ค.
ํ๋๊ฐ ๋ฐฐ์ถ๋ฅผ ์ฌ๋ฐฐํ๋ ๋ ์ ๊ณ ๋ฅด์ง ๋ชปํด์ ๋ฐฐ์ถ๋ฅผ ๊ตฐ๋ฐ๊ตฐ๋ฐ ์ฌ์ด ๋์๋ค. ๋ฐฐ์ถ๋ค์ด ๋ชจ์ฌ์๋ ๊ณณ์๋ ๋ฐฐ์ถํฐ์ง๋ ์ด๊ฐ ํ ๋ง๋ฆฌ๋ง ์์ผ๋ฉด ๋๋ฏ๋ก ์๋ก ์ธ์ ํด์๋ ๋ฐฐ์ถ๋ค์ด ๋ช ๊ตฐ๋ฐ์ ํผ์ ธ์๋์ง ์กฐ์ฌํ๋ฉด ์ด ๋ช ๋ง๋ฆฌ์ ์ง๋ ์ด๊ฐ ํ์ํ์ง ์ ์ ์๋ค. ์๋ฅผ ๋ค์ด ๋ฐฐ์ถ๋ฐญ์ด ์๋์ ๊ฐ์ด ๊ตฌ์ฑ๋์ด ์์ผ๋ฉด ์ต์ 5๋ง๋ฆฌ์ ๋ฐฐ์ถํฐ์ง๋ ์ด๊ฐ ํ์ํ๋ค. 0์ ๋ฐฐ์ถ๊ฐ ์ฌ์ด์ ธ ์์ง ์์ ๋ ์ด๊ณ , 1์ ๋ฐฐ์ถ๊ฐ ์ฌ์ด์ ธ ์๋ ๋ ์ ๋ํ๋ธ๋ค.
1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 |
0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 |
์ ๋ ฅ
์ ๋ ฅ์ ์ฒซ ์ค์๋ ํ ์คํธ ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์ ์ค๋ถํฐ ๊ฐ๊ฐ์ ํ ์คํธ ์ผ์ด์ค์ ๋ํด ์ฒซ์งธ ์ค์๋ ๋ฐฐ์ถ๋ฅผ ์ฌ์ ๋ฐฐ์ถ๋ฐญ์ ๊ฐ๋ก๊ธธ์ด M(1 ≤ M ≤ 50)๊ณผ ์ธ๋ก๊ธธ์ด N(1 ≤ N ≤ 50), ๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ถ๊ฐ ์ฌ์ด์ ธ ์๋ ์์น์ ๊ฐ์ K(1 ≤ K ≤ 2500)์ด ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์ K์ค์๋ ๋ฐฐ์ถ์ ์์น X(0 ≤ X ≤ M-1), Y(0 ≤ Y ≤ N-1)๊ฐ ์ฃผ์ด์ง๋ค. ๋ ๋ฐฐ์ถ์ ์์น๊ฐ ๊ฐ์ ๊ฒฝ์ฐ๋ ์๋ค.
์ถ๋ ฅ
๊ฐ ํ ์คํธ ์ผ์ด์ค์ ๋ํด ํ์ํ ์ต์์ ๋ฐฐ์ถํฐ์ง๋ ์ด ๋ง๋ฆฌ ์๋ฅผ ์ถ๋ ฅํ๋ค.
์ ์ถ๋ ฅ ์์
์ ๋ ฅ
2
10 8 17
0 0
1 0
1 1
4 2
4 3
4 5
2 4
3 4
7 4
8 4
9 4
7 5
8 5
9 5
7 6
8 6
9 6
10 10 1
5 5
์ถ๋ ฅ
5
1
๋ด ๋ฌธ์ ํ์ด
// BOJ #1012 ์ ๊ธฐ๋ ๋ฐฐ์ถ
/*
#1926 ๊ทธ๋ฆผ์ด๋ ์์ฅฌ ๋น์ท
2์ค for๋ฌธ์ผ๋ก ๋ฐ๋ณตํ๋ฉด์ ๋ชจ๋ ์๋ฆฌ ํ์ํ๋๋ฐ,
ํ์ํ๋ฉด์ 1์ด ๋์ค๋ฉด ๊ทธ ๋ dfs ํจ์ ๋๋ ค์ค ์ด ๋ ์นด์ดํธ +1
dfs ํจ์๋ ์ํ์ข์ฐ ๋ชจ๋ ์ฒดํฌํ๋๋ฐ ์ฒดํฌํ๋ค๊ฐ ๋ฒ์ ๋ฒ์ด๋๊ฑฐ๋ 0๋ง๋ ์ ๋์ด๊ณ
1๋ง๋ ์์๋ ๊ทธ๋ฅ ๊ณ์๊ฐ ๊ทผ๋ฐ ์ด๋ฏธ ์ฒดํฌ๋๋ ์๋ฆฌ๋ 0์ผ๋ก ๋ฐ๊ฟ์ค
์ด๊ฑฐ ๋
๋๊น์ง ๋ฐ๋ณต!
*/
let testCase = Int(readLine()!)!
func dfs(_ x: Int, _ y: Int, _ land: inout [[Int]], _ m: Int, _ n: Int) {
// ๋
ํฌ๊ธฐ ์์ ํด๋นํ์ง ์๊ฑฐ๋, 1์ด ์๋ ๊ฒฝ์ฐ์ ํจ์ ์ข
๋ฃ
if x < 0 || x >= n || y < 0 || y >= m || land[x][y] != 1 { return }
land[x][y] = 0 // ์ด๋ฏธ ์ฒดํฌํ ์๋ฆฌ๋ 0์ผ๋ก ๋ฐ๊ฟ์ฃผ๊ธฐ
// ์ฌ๊ท ํธ์ถ (ํ์ฌ ์๋ฆฌ์ ๋ถ์ด์๋ ์ฃผ๋ณ ๋ชจ๋ ์๋ฆฌ ํ์ธ)
dfs(x+1, y, &land, m, n) // ์ธ๋ก๋ก ๋ค์ ์๋ฆฌ
dfs(x-1, y, &land, m, n) // ์ธ๋ก๋ก ์ ์๋ฆฌ
dfs(x, y+1, &land, m, n) // ๊ฐ๋ก๋ก ๋ค์ ์๋ฆฌ
dfs(x, y-1, &land, m, n) // ๊ฐ๋ก๋ก ์ ์๋ฆฌ
}
for _ in 0..<testCase {
let input = readLine()!.split(separator: " ").map({Int(String($0))!})
let m = input[0] // ๋ฐฐ์ถ๋ฐญ ๊ฐ๋ก ๊ธธ์ด
let n = input[1] // ๋ฐฐ์ถ๋ฐญ ์ธ๋ก ๊ธธ์ด
let num = input[2] // ๋ฐฐ์ถ ๊ฐ์
var land = Array(repeating: Array(repeating: 0, count: m), count: n)
var count = 0
// ๋ฐฐ์ถ ์๋ ์๋ฆฌ๋ ๋ค 1๋ก ์ฑ์์ฃผ๊ธฐ
for _ in 0..<num {
let location = readLine()!.split(separator: " ").map({Int(String($0))!})
land[location[1]][location[0]] = 1
}
// ๋
์ ๋ถ ๊ฒ์ฌํ๋ฉด์ 1์์ผ๋ฉด dfs ๋๋ฆฌ๊ธฐ
for i in 0..<n {
for j in 0..<m {
if land[i][j] == 1 {
count += 1
dfs(i, j, &land, m, n)
}
}
}
print(count)
}
๐ DFS ๋ฌธ์ ๋ก, ์ด์ ์ ํ์๋ #1926 ๊ทธ๋ฆผ ๋ฌธ์ ์ ์์ฃผ ์ ์ฌํจ! ์๋ก ์ธ์ ํ '1'๋ค์ ๋ชจ์์ ์ฐพ๋๊ฒ ํฌ์ธํธ!
- ๊ฐ์ฅ ์ฒซ ๋ฒ์งธ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ํ ์คํธ์ผ์ด์ค์ ๊ฐ์ ๊ฐ๋งํผ for๋ฌธ์ ํ์ฉํด ๋ฐ๋ณตํด์ฃผ์๋ค.
- ๋
์ ์๋ฏธํ๋ land 2์ฐจ์ ๋ฐฐ์ด์ ์
๋ ฅ๋ ๋
ํฌ๊ธฐ์ ๊ฐ๋๋ก ์์ฑํด์ฃผ๊ณ ,
๋ฐฐ์ถ์ ๊ฐ์๋งํผ for๋ฌธ์ ๋ฐ๋ณตํ์ฌ ๋ฐฐ์ถ์ ์์น๋ง๋ค land ๋ฐฐ์ด์ 1์ ํ ๋นํ๋ค. - 2์ค for๋ฌธ์ ์ฌ์ฉํ์ฌ land์ ๋ชจ๋ ์๋ฆฌ๋ฅผ ํ์ํ์ฌ 1์ด ๋์ฌ๋๋ง๋ค dfs ํจ์๋ฅผ ์คํ์์ผฐ๊ณ ,
bfsํจ์๋ฅผ ์คํ์ํฌ ๋๋ง๋ค 1์ฉ ์นด์ดํธํ๋ค.
=> ์์ฑํ dfsํจ์๋ ์ธ์ ํ '1'๋ค๋ก ์ด๋ฃจ์ด์ง ํ๋์ ๊ทธ๋ฃน์ ๋ฒ์๋ฅผ ์ฐพ๋ ์ญํ ์ ํ๋ฏ๋ก
ํ ๋ฒ dfs๋ฅผ ํธ์ถํ๋ค๋ ๊ฒ์ ํ๋์ ์ธ์ ํ ๋ฐฐ์ถ๋ค์ ๋ชจ์์ ๋ฐ๊ฒฌํ๋ค๋ ์๋ฏธ์ ๊ฐ๊ธฐ ๋๋ฌธ์ด๋ค. - dfs ํจ์๋ ์ฌ๊ท๋ก ๊ตฌํํด์ฃผ์๋๋ฐ, ์ฒ์ ๋ฐ๊ฒฌํ๋ 1์ด ์๋ ์๋ฆฌ๋ฅผ ์์์ผ๋ก
์ํ์ข์ฐ๋ก ์ด๋ํ๋ ๊ฒ์ ์ฌ๊ท ํธ์ถํ์ฌ ์ด๋๊น์ง 1์ด ์ธ์ ํด์๋์ง ํ์ํ๋ค.
ํ์ํ๋ค๊ฐ 0์ ๋ง๋๋ฉด ํด๋น ํธ์ถ์ ์ข ๋ฃ๋๊ณ , ๋ง์ฐฌ๊ฐ์ง๋ก ๋ ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๋๋ ์ข ๋ฃ๋๋ค.
๊ทธ ์ธ์ 1์ ๋ง๋ฌ์ ๋๋ ์๋ก์ด ์ฌ๊ท ํธ์ถ์ ๊ณ์ํ๊ณ , ๋ฐฉ๊ธ ์ฒดํฌํ ์๋ฆฌ๋ 0์ผ๋ก ๋ฐ๊ฟ์ ์ค๋ณต์ ํผํ๋ค.
๐ก ํผ๋๋ฐฑ
- ์ด์ ์ ํผ ๋ฌธ์ ์ ๋น์ทํ๊ธฐ๋ ํ๊ณ , ์ด์ ์์ํ dfs๊ฐ ์ต์ํด์ ธ์ ๊ธ๋ฐฉ ํ์๋ค.
- ์ฌ๊ทํจ์๋ฅผ ์ด์ฉํ๋๊น ๋ ๊น๋ํ๊ฒ ํ ์ ์์๋ ๊ฒ ๊ฐ๋ค.
๋ฌธ์