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

[Swift Algorithm] ์œ ๊ธฐ๋† ๋ฐฐ์ถ” BOJ #1012

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

์ฐจ์„ธ๋Œ€ ์˜๋†์ธ ํ•œ๋‚˜๋Š” ๊ฐ•์›๋„ ๊ณ ๋žญ์ง€์—์„œ ์œ ๊ธฐ๋† ๋ฐฐ์ถ”๋ฅผ ์žฌ๋ฐฐํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค. ๋†์•ฝ์„ ์“ฐ์ง€ ์•Š๊ณ  ๋ฐฐ์ถ”๋ฅผ ์žฌ๋ฐฐํ•˜๋ ค๋ฉด ๋ฐฐ์ถ”๋ฅผ ํ•ด์ถฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ•œ๋‚˜๋Š” ํ•ด์ถฉ ๋ฐฉ์ง€์— ํšจ๊ณผ์ ์ธ ๋ฐฐ์ถ”ํฐ์ง€๋ ์ด๋ฅผ ๊ตฌ์ž…ํ•˜๊ธฐ๋กœ ๊ฒฐ์‹ฌํ•œ๋‹ค. ์ด ์ง€๋ ์ด๋Š” ๋ฐฐ์ถ”๊ทผ์ฒ˜์— ์„œ์‹ํ•˜๋ฉฐ ํ•ด์ถฉ์„ ์žก์•„ ๋จน์Œ์œผ๋กœ์จ ๋ฐฐ์ถ”๋ฅผ ๋ณดํ˜ธํ•œ๋‹ค. ํŠนํžˆ, ์–ด๋–ค ๋ฐฐ์ถ”์— ๋ฐฐ์ถ”ํฐ์ง€๋ ์ด๊ฐ€ ํ•œ ๋งˆ๋ฆฌ๋ผ๋„ ์‚ด๊ณ  ์žˆ์œผ๋ฉด ์ด ์ง€๋ ์ด๋Š” ์ธ์ ‘ํ•œ ๋‹ค๋ฅธ ๋ฐฐ์ถ”๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์–ด, ๊ทธ ๋ฐฐ์ถ”๋“ค ์—ญ์‹œ ํ•ด์ถฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ํ•œ ๋ฐฐ์ถ”์˜ ์ƒํ•˜์ขŒ์šฐ ๋„ค ๋ฐฉํ–ฅ์— ๋‹ค๋ฅธ ๋ฐฐ์ถ”๊ฐ€ ์œ„์น˜ํ•œ ๊ฒฝ์šฐ์— ์„œ๋กœ ์ธ์ ‘ํ•ด์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

ํ•œ๋‚˜๊ฐ€ ๋ฐฐ์ถ”๋ฅผ ์žฌ๋ฐฐํ•˜๋Š” ๋•…์€ ๊ณ ๋ฅด์ง€ ๋ชปํ•ด์„œ ๋ฐฐ์ถ”๋ฅผ ๊ตฐ๋ฐ๊ตฐ๋ฐ ์‹ฌ์–ด ๋†“์•˜๋‹ค. ๋ฐฐ์ถ”๋“ค์ด ๋ชจ์—ฌ์žˆ๋Š” ๊ณณ์—๋Š” ๋ฐฐ์ถ”ํฐ์ง€๋ ์ด๊ฐ€ ํ•œ ๋งˆ๋ฆฌ๋งŒ ์žˆ์œผ๋ฉด ๋˜๋ฏ€๋กœ ์„œ๋กœ ์ธ์ ‘ํ•ด์žˆ๋Š” ๋ฐฐ์ถ”๋“ค์ด ๋ช‡ ๊ตฐ๋ฐ์— ํผ์ ธ์žˆ๋Š”์ง€ ์กฐ์‚ฌํ•˜๋ฉด ์ด ๋ช‡ ๋งˆ๋ฆฌ์˜ ์ง€๋ ์ด๊ฐ€ ํ•„์š”ํ•œ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฐ์ถ”๋ฐญ์ด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉด ์ตœ์†Œ 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๊ฐ€ ์ต์ˆ™ํ•ด์ ธ์„œ ๊ธˆ๋ฐฉ ํ’€์—ˆ๋‹ค.
  • ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋‹ˆ๊นŒ ๋” ๊น”๋”ํ•˜๊ฒŒ ํ’€ ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

 

๋ฌธ์ œ

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

๋Œ“๊ธ€