๋ฌธ์ ์ค๋ช
๋๊ธ์ ๊ฐ๊ฒฉ์ด 1์ธ M×N(M,N≤100)ํฌ๊ธฐ์ ๋ชจ๋์ข ์ด๊ฐ ์๋ค. ์ด ๋ชจ๋์ข ์ด ์์ ๋๊ธ์ ๋ง์ถ์ด K๊ฐ์ ์ง์ฌ๊ฐํ์ ๊ทธ๋ฆด ๋, ์ด๋ค K๊ฐ์ ์ง์ฌ๊ฐํ์ ๋ด๋ถ๋ฅผ ์ ์ธํ ๋๋จธ์ง ๋ถ๋ถ์ด ๋ช ๊ฐ์ ๋ถ๋ฆฌ๋ ์์ญ์ผ๋ก ๋๋์ด์ง๋ค.
์๋ฅผ ๋ค์ด M=5, N=7 ์ธ ๋ชจ๋์ข ์ด ์์ <๊ทธ๋ฆผ 1>๊ณผ ๊ฐ์ด ์ง์ฌ๊ฐํ 3๊ฐ๋ฅผ ๊ทธ๋ ธ๋ค๋ฉด, ๊ทธ ๋๋จธ์ง ์์ญ์ <๊ทธ๋ฆผ 2>์ ๊ฐ์ด 3๊ฐ์ ๋ถ๋ฆฌ๋ ์์ญ์ผ๋ก ๋๋์ด์ง๊ฒ ๋๋ค.
<๊ทธ๋ฆผ 2>์ ๊ฐ์ด ๋ถ๋ฆฌ๋ ์ธ ์์ญ์ ๋์ด๋ ๊ฐ๊ฐ 1, 7, 13์ด ๋๋ค.
M, N๊ณผ K ๊ทธ๋ฆฌ๊ณ K๊ฐ์ ์ง์ฌ๊ฐํ์ ์ขํ๊ฐ ์ฃผ์ด์ง ๋, K๊ฐ์ ์ง์ฌ๊ฐํ ๋ด๋ถ๋ฅผ ์ ์ธํ ๋๋จธ์ง ๋ถ๋ถ์ด ๋ช ๊ฐ์ ๋ถ๋ฆฌ๋ ์์ญ์ผ๋ก ๋๋์ด์ง๋์ง, ๊ทธ๋ฆฌ๊ณ ๋ถ๋ฆฌ๋ ๊ฐ ์์ญ์ ๋์ด๊ฐ ์ผ๋ง์ธ์ง๋ฅผ ๊ตฌํ์ฌ ์ด๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ M๊ณผ N, ๊ทธ๋ฆฌ๊ณ K๊ฐ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฐจ๋ก๋ก ์ฃผ์ด์ง๋ค. M, N, K๋ ๋ชจ๋ 100 ์ดํ์ ์์ฐ์์ด๋ค. ๋์งธ ์ค๋ถํฐ K๊ฐ์ ์ค์๋ ํ ์ค์ ํ๋์ฉ ์ง์ฌ๊ฐํ์ ์ผ์ชฝ ์๋ ๊ผญ์ง์ ์ x, y์ขํ๊ฐ๊ณผ ์ค๋ฅธ์ชฝ ์ ๊ผญ์ง์ ์ x, y์ขํ๊ฐ์ด ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฐจ๋ก๋ก ์ฃผ์ด์ง๋ค. ๋ชจ๋์ข ์ด์ ์ผ์ชฝ ์๋ ๊ผญ์ง์ ์ ์ขํ๋ (0,0)์ด๊ณ , ์ค๋ฅธ์ชฝ ์ ๊ผญ์ง์ ์ ์ขํ๋(N,M)์ด๋ค. ์ ๋ ฅ๋๋ K๊ฐ์ ์ง์ฌ๊ฐํ๋ค์ด ๋ชจ๋์ข ์ด ์ ์ฒด๋ฅผ ์ฑ์ฐ๋ ๊ฒฝ์ฐ๋ ์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๋ถ๋ฆฌ๋์ด ๋๋์ด์ง๋ ์์ญ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค. ๋์งธ ์ค์๋ ๊ฐ ์์ญ์ ๋์ด๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ถ๋ ฅํ๋ค.
์ ์ถ๋ ฅ ์์
์ ๋ ฅ
5 7 3
0 2 4 4
1 1 2 5
4 0 6 2
์ถ๋ ฅ
3
1 7 13
๋ด ๋ฌธ์ ํ์ด
let info = readLine()!.split(separator: " ").map({Int(String($0))!})
let m = info[0]
let n = info[1]
let k = info[2]
var paper = Array(repeating: Array(repeating: 0, count: n), count: m)
var area = [Int]()
var area_tmp = 0
// ์ง์ฌ๊ฐํ๋ค ๊ทธ๋ ค์ฃผ๊ธฐ
for _ in 0..<k {
let draw = readLine()!.split(separator: " ").map({Int(String($0))!}) // ์ง์ฌ๊ฐํ ์ขํ
for i in draw[0]..<draw[2] {
for j in draw[1]..<draw[3] {
paper[j][i] += 1
}
}
}
// dfs ์ฌ๊ทํจ์
func dfs(_ x: Int, _ y: Int) {
if x < 0 || x >= m || y < 0 || y >= n || paper[x][y] != 0 { return }
paper[x][y] = 1 // ์ด๋ฏธ ์ฒดํฌํ ์๋ฆฌ๋ 1๋ก ๋ฐ๊ฟ์ฃผ๊ธฐ
area_tmp += 1 // area_tmp 1 ์ฆ๊ฐ์์ผ์ฃผ๊ธฐ
// ์ฌ๊ท ํธ์ถ (ํ์ฌ ์๋ฆฌ์ ๋ถ์ด์๋ ์ฃผ๋ณ ๋ชจ๋ ์๋ฆฌ ํ์ธ)
dfs(x+1, y) // ์ธ๋ก๋ก ๋ค์ ์๋ฆฌ
dfs(x-1, y) // ์ธ๋ก๋ก ์ ์๋ฆฌ
dfs(x, y+1) // ๊ฐ๋ก๋ก ๋ค์ ์๋ฆฌ
dfs(x, y-1) // ๊ฐ๋ก๋ก ์ ์๋ฆฌ
}
// ๋ฉ์ธ ์คํ๋ฌธ
for i in 0..<n {
for j in 0..<m {
if paper[j][i] == 0 {
area_tmp = 0
dfs(j, i)
area.append(area_tmp)
}
}
}
print(area.count)
print(area.sorted().map({String($0)}).joined(separator: " "))
๐ dfs ๋ฌธ์ ๋ก, ๋จผ์ ์ง์ฌ๊ฐํ ์๋ฆฌ๋ค์ 1๋ก ์ฑ์์ค ํ 0์ผ๋ก ์ด์ด์ง ์์ญ๋ค์ ์ฐพ๋๊ฒ ํฌ์ธํธ!
(์ด์ ์ ๊ฒ์ํ๋ #1926 ๊ทธ๋ฆผ ๋ฌธ์ ์ ์์ฃผ ์ ์ฌํ๋ฏ๋ก ๊ฐ๋จํ ์ค๋ช ํ๊ฒ ๋ค.)
- ๊ฐ์ฅ ๋จผ์ k ๊ฐ์ ์ด์ฉํ์ฌ ์ง์ฌ๊ฐํ ์๋ฆฌ๋ค์ ์ฑ์์ฃผ์๋ค.
for ๋ฐ๋ณต์ ์ด์ฉํ๊ณ , ์ง์ฌ๊ฐํ์ด ๊ทธ๋ ค์ง ์๋ฆฌ์๋ 1์ ๋ํ๋ค.
=> ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ง ์๋ฆฌ๋ 1 ์ด์์ ์๊ฐ ์ฑ์์ง๊ณ , ๊ทธ ์ธ์ ์๋ฆฌ๋ ๋ชจ๋ 0์ด ๋จ - 2์ค for๋ฌธ์ ์ด์ฉํด์ ์ข
์ด(paper ๋ฐฐ์ด)์ ํ์ํ๋ค๊ฐ, 0์ ๋ง๋๋ฉด dfs๋ฅผ ์คํํ๋ค.
dfs ํจ์๋ ์ฌ๊ท๋ก ๊ตฌํํ๊ณ , ์ฒดํฌ ์๋ฃํ ์๋ฆฌ๋ 1๋ก ๋ฐ๊ฟ์ฃผ๋ฉด์ ๋์ด๋ฅผ ๊ตฌํ๋ค.
๐ก ํผ๋๋ฐฑ
- ์ด์ ์ ํ์๋ ๋ฌธ์ ์ ์ ์ฌํด์ ๊ธ๋ฐฉ ํ ์ ์์๋ค.
- ์ขํ๊ฐ ์ข์ธก ํ๋จ๋ถํฐ ์ฐ์ธก ํ๋จ์ผ๋ก ๋ป์ด๋๊ฐ๋ ๊ฒ์ผ๋ก ์ฃผ์ด์ก๊ธฐ ๋๋ฌธ์
๋ฐฐ์ด์ ์ขํ๋ฅผ ์ง์ ํด์ฃผ๋ ๋ถ๋ถ์์ ์กฐ๊ธ ํท๊ฐ๋ ธ๋๋ฐ, ์ขํ๋ง ๋ฐ๋๋ก ์๊ฐํ๋ฉด ์ฝ๊ฒ ํด๊ฒฐํ ์ ์์๋ค.
๋ฌธ์
'3๏ธโฃ Swift > Problem Solving' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift Algorithm] ๋์ดํธ์ ์ด๋ BOJ #7562 (0) | 2021.10.11 |
---|---|
[Swift Algorithm] ๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ BOJ #2667 (0) | 2021.10.10 |
[Swift Algorithm] ํ ๋งํ BOJ #7659 (0) | 2021.10.08 |
[Swift Algorithm] ์ ๊ธฐ๋ ๋ฐฐ์ถ BOJ #1012 (0) | 2021.10.05 |
[Swift Algorithm] ์จ๋ฐ๊ผญ์ง BOJ #1697 (2) | 2021.10.05 |
๋๊ธ