๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
3๏ธโƒฃ Swift/Problem Solving

[Swift Algorithm] ์˜์—ญ ๊ตฌํ•˜๊ธฐ BOJ #2583

by seolhee2750 2021. 10. 10.
๋ฌธ์ œ ์„ค๋ช…

๋ˆˆ๊ธˆ์˜ ๊ฐ„๊ฒฉ์ด 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๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด์„œ ๋„“์ด๋ฅผ ๊ตฌํ–ˆ๋‹ค.

 

๐Ÿ’ก ํ”ผ๋“œ๋ฐฑ
  • ์ด์ „์— ํ’€์—ˆ๋˜ ๋ฌธ์ œ์™€ ์œ ์‚ฌํ•ด์„œ ๊ธˆ๋ฐฉ ํ’€ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  • ์ขŒํ‘œ๊ฐ€ ์ขŒ์ธก ํ•˜๋‹จ๋ถ€ํ„ฐ ์šฐ์ธก ํ•˜๋‹จ์œผ๋กœ ๋ป—์–ด๋‚˜๊ฐ€๋Š” ๊ฒƒ์œผ๋กœ ์ฃผ์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์—
    ๋ฐฐ์—ด์˜ ์ขŒํ‘œ๋ฅผ ์ง€์ •ํ•ด์ฃผ๋Š” ๋ถ€๋ถ„์—์„œ ์กฐ๊ธˆ ํ—ท๊ฐˆ๋ ธ๋Š”๋ฐ, ์ขŒํ‘œ๋งŒ ๋ฐ˜๋Œ€๋กœ ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 


๋ฌธ์ œ

https://www.acmicpc.net/problem/2583

๋Œ“๊ธ€