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

[Swift Algorithm] ๊ทธ๋ฆผ BOJ #1926

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

์–ด๋–ค ํฐ ๋„ํ™”์ง€์— ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ ธ ์žˆ์„ ๋•Œ, ๊ทธ ๊ทธ๋ฆผ์˜ ๊ฐœ์ˆ˜์™€, ๊ทธ ๊ทธ๋ฆผ ์ค‘ ๋„“์ด๊ฐ€ ๊ฐ€์žฅ ๋„“์€ ๊ฒƒ์˜ ๋„“์ด๋ฅผ ์ถœ๋ ฅํ•˜์—ฌ๋ผ. ๋‹จ, ๊ทธ๋ฆผ์ด๋ผ๋Š” ๊ฒƒ์€ 1๋กœ ์—ฐ๊ฒฐ๋œ ๊ฒƒ์„ ํ•œ ๊ทธ๋ฆผ์ด๋ผ๊ณ  ์ •์˜ํ•˜์ž. ๊ฐ€๋กœ๋‚˜ ์„ธ๋กœ๋กœ ์—ฐ๊ฒฐ๋œ ๊ฒƒ์€ ์—ฐ๊ฒฐ์ด ๋œ ๊ฒƒ์ด๊ณ  ๋Œ€๊ฐ์„ ์œผ๋กœ ์—ฐ๊ฒฐ์ด ๋œ ๊ฒƒ์€ ๋–จ์–ด์ง„ ๊ทธ๋ฆผ์ด๋‹ค. ๊ทธ๋ฆผ์˜ ๋„“์ด๋ž€ ๊ทธ๋ฆผ์— ํฌํ•จ๋œ 1์˜ ๊ฐœ์ˆ˜์ด๋‹ค.

 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋„ํ™”์ง€์˜ ์„ธ๋กœ ํฌ๊ธฐ n(1 ≤ n ≤ 500)๊ณผ ๊ฐ€๋กœ ํฌ๊ธฐ m(1 ≤ m ≤ 500)์ด ์ฐจ๋ก€๋กœ ์ฃผ์–ด์ง„๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ n+1 ์ค„ ๊นŒ์ง€ ๊ทธ๋ฆผ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (๋‹จ ๊ทธ๋ฆผ์˜ ์ •๋ณด๋Š” 0๊ณผ 1์ด ๊ณต๋ฐฑ์„ ๋‘๊ณ  ์ฃผ์–ด์ง€๋ฉฐ, 0์€ ์ƒ‰์น ์ด ์•ˆ๋œ ๋ถ€๋ถ„, 1์€ ์ƒ‰์น ์ด ๋œ ๋ถ€๋ถ„์„ ์˜๋ฏธํ•œ๋‹ค)

 

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์—๋Š” ๊ทธ๋ฆผ์˜ ๊ฐœ์ˆ˜, ๋‘˜์งธ ์ค„์—๋Š” ๊ทธ ์ค‘ ๊ฐ€์žฅ ๋„“์€ ๊ทธ๋ฆผ์˜ ๋„“์ด๋ฅผ ์ถœ๋ ฅํ•˜์—ฌ๋ผ. ๋‹จ, ๊ทธ๋ฆผ์ด ํ•˜๋‚˜๋„ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ฐ€์žฅ ๋„“์€ ๊ทธ๋ฆผ์˜ ๋„“์ด๋Š” 0์ด๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ์ œ

์ž…๋ ฅ

6 5
1 1 0 1 1
0 1 1 0 0
0 0 0 0 0
1 0 1 1 1
0 0 1 1 1
0 0 1 1 1

์ถœ๋ ฅ

4
9

 

๋‚ด ๋ฌธ์ œ ํ’€์ด
import Foundation

let paper = readLine()!.split(separator: " ").map({Int(String($0))!}) // ์ฃผ์–ด์ง„ ๋„ํ™”์ง€์˜ ํฌ๊ธฐ (์„ธ๋กœ, ๊ฐ€๋กœ)
var check = [[Int]]() // ๋„ํ™”์ง€ ์นธ ๋ณ„๋กœ ์ˆซ์ž ์ž…๋ ฅ๋ฐ›๋Š” ๋ฐฐ์—ด

for _ in 0..<paper[0] {
    check.append(Array(readLine()!.split(separator: " ").map({Int(String($0))!})))
}

var count = 0 // ๊ทธ๋ฆผ ๊ฐœ์ˆ˜ ์นด์šดํŠธ
var area = 0 // ๊ทธ๋ฆผ๋งˆ๋‹ค ๋„“์ด ์ฒดํฌ
var max = 0 // ์ตœ๋Œ€ ๊ทธ๋ฆผ ํฌ๊ธฐ

// dfs ์žฌ๊ท€ํ•จ์ˆ˜
func solution(_ x: Int, _ y: Int) {
    if x < 0 || x >= paper[0] || y < 0 || y >= paper[1] || check[x][y] != 1 { return }
    
    check[x][y] = 0
    area += 1
    
    // ์žฌ๊ท€ ํ˜ธ์ถœ (ํ˜„์žฌ ์ž๋ฆฌ์™€ ๋ถ™์–ด์žˆ๋Š” ์ฃผ๋ณ€ ๋ชจ๋“  ์ž๋ฆฌ ํ™•์ธ)
    solution(x+1, y) // ์„ธ๋กœ๋กœ ๋‹ค์Œ ์ž๋ฆฌ
    solution(x-1, y) // ์„ธ๋กœ๋กœ ์ „ ์ž๋ฆฌ
    solution(x, y+1) // ๊ฐ€๋กœ๋กœ ๋‹ค์Œ ์ž๋ฆฌ
    solution(x, y-1) // ๊ฐ€๋กœ๋กœ ์ „ ์ž๋ฆฌ
}

// ์„ธ๋กœ๊ฐ€ 0 ์ด์ƒ์ผ ๊ฒฝ์šฐ ์ฝ”๋“œ ์‹คํ–‰
if paper[0] > 0 {
    for i in 0..<paper[0] {
        for j in 0..<paper[1] {
            if check[i][j] == 1 {
                area = 0
                solution(i, j)
                count += 1 // ์นด์šดํŠธ
                if max < area { max = area }
            }
        }
    }
}

print(count) // ๊ทธ๋ฆผ์˜ ๊ฐœ์ˆ˜
print(max) // ์ตœ๋Œ€ ๊ทธ๋ฆผ์˜ ํฌ๊ธฐ

๐Ÿ‘‰ DFS ๋ฌธ์ œ! 1๋กœ ์ฑ„์›Œ์ง„ ๋ชจ๋“  ์ž๋ฆฌ์™€, ๊ทธ ์ž๋ฆฌ์™€ ์ด์–ด์ง„ ๋ชจ๋“  ์ž๋ฆฌ๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ์ด ํฌ์ธํŠธ!!

1์ด ์žˆ์œผ๋ฉด ๊ทธ ์ž๋ฆฌ ์ฃผ๋ณ€์˜ ๋ชจ๋“  ์ž๋ฆฌ๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ๋˜‘๊ฐ™์€ ์ˆ˜ํ–‰์„ ๊ณ„์† ๋ฐ˜๋ณตํ•ด์•ผํ•˜๋ฏ€๋กœ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ํ’€์ดํ–ˆ๋‹ค.

  • 1) ์šฐ์„  ์—ฐ์‚ฐ์— ํ•„์š”ํ•œ ์ฃผ์š” ๋ณ€์ˆ˜ ์„ธ ๊ฐœ๋ฅผ ์„ ์–ธํ•ด์ฃผ์—ˆ๋‹ค.
    count๋Š” ๋‹ต์œผ๋กœ ์ถœ๋ ฅํ•ด์•ผํ•˜๋Š” ์š”์†Œ ์ค‘ ํ•˜๋‚˜๋กœ, ๊ทธ๋ฆผ์˜ ์ด ๊ฐœ์ˆ˜๋ฅผ ๋‹ด์„ ์˜ˆ์ •!
    area๋Š” ์žฌ๊ท€ํ•จ์ˆ˜ ์•ˆ์—์„œ 1์”ฉ ๋”ํ•ด๊ฐ€๋ฉฐ ๊ฐ ๊ทธ๋ฆผ๋งˆ๋‹ค์˜ ๋„ˆ๋น„๋ฅผ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ.
    max๋Š” count์™€ ํ•จ๊ป˜ ๋‹ต์œผ๋กœ ์ถœ๋ ฅํ•  ์š”์†Œ๋กœ, ๋” ํฐ area๊ฐ€ ๋“ฑ์žฅํ•  ๋•Œ๋งˆ๋‹ค ๊ณ„์† ์—…๋ฐ์ดํŠธ!
  • 2) DFS ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํ™•์ธํ•˜๊ธฐ ์ „ ์•„๋ž˜์˜ ๋ฉ”์ธ ์‹คํ–‰ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ํ™•์ธํ•ด๋ณด์ž.
    2์ค‘ for๋ฌธ์„ ํ™œ์šฉํ•˜์—ฌ ๋ชจ๋“  ์นธ์„ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๊ณ ,
    ๊ฒ€์‚ฌํ•˜๋‹ค๊ฐ€ ํ•ด๋‹น ์นธ์ด 1์ผ ๊ฒฝ์šฐ ์œ„์—์„œ ์ž‘์„ฑํ•œ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ํ–ˆ๋‹ค.
    (์‹คํ–‰์‹œํ‚ค๊ธฐ ์ „์—๋Š” ๋„ˆ๋น„๋ฅผ ์ธก์ •ํ•ด์ค„ area ๋ณ€์ˆ˜๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ–ˆ๋‹ค.)
    ๊ทธ๋ฆฌ๊ณ  1์ด ๋‚˜์™”๋‹ค๋Š”๊ฑด ์ ์–ด๋„ ํฌ๊ธฐ๊ฐ€ 1์ธ ๊ทธ๋ฆผ์ด ํ•˜๋‚˜ ์žˆ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ count์— 1์„ ๋”ํ•ด์คฌ๋‹ค.
    ๋งˆ์ง€๋ง‰์œผ๋กœ max๋ณด๋‹ค, ๋ฐฉ๊ธˆ ๋Œ๋ฆฐ solution ํ•จ์ˆ˜๊ฐ€ ๊ตฌํ•œ area๊ฐ€ ๋” ํฌ๋ฉด max๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ๋‹ค.
  • 3) ์ด์ œ solution ์žฌ๊ท€ํ•จ์ˆ˜์˜ ์‹คํ–‰ ๊ณผ์ •์„ ์‚ดํŽด๋ณด์ž.
    ์ด ๋ฌธ์ œ๋Š” 1๋กœ ์ฑ„์›Œ์ง„ ์ž๋ฆฌ๋“ค์ด ๋ช‡ ๊ฐœ๊นŒ์ง€ ์ด์–ด์ ธ์žˆ๋Š”์ง€๋ฅผ ์ฒดํฌํ•ด์•ผํ•œ๋‹ค.
    ๋”ฐ๋ผ์„œ solution ํ•จ์ˆ˜ ์•ˆ์—์„œ ์„ธ๋กœ, ๊ฐ€๋กœ๋กœ ๋ชจ๋“  ๋ฐฉํ–ฅ์œผ๋กœ ๋‹ค์‹œ solution ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ
    ์ƒํ•˜์ขŒ์šฐ์˜ ์ž๋ฆฌ๊ฐ€ 1์ธ์ง€ 0์ธ์ง€ ์ฒดํฌํ•ด์ค€๋‹ค.
    ์ฒดํฌํ•˜๋Š” ์ž๋ฆฌ๊ฐ€ ๋„ํ™”์ง€์˜ ๋ฒ”์œ„๋ฅผ ๋„˜์–ด์„œ๊ฑฐ๋‚˜ 0์ผ ๊ฒฝ์šฐ๋Š” if๋ฌธ์„ ์ด์šฉํ•ด ์˜ˆ์™ธ๋กœ ๋นผ์ฃผ์—ˆ๊ณ ,
    ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ๋Š” ํ˜„์žฌ ์ฒดํฌ์™„๋ฃŒํ•œ ์ž๋ฆฌ๋ฅผ 0์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ค€ ํ›„ area์—๋Š” 1์„ ๋”ํ–ˆ๋‹ค.
    (0์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ค€ ์ด์œ ๋Š”, ์–ด์ฐจํ”ผ ์ด์–ด์ง„ ์ž๋ฆฌ๋“ค์€ ํ•˜๋‚˜์˜ ๊ทธ๋ฆผ์ด๋ผ ๋‹ค์‹œ ๊ฒ€์‚ฌํ•  ํ•„์š”๊ฐ€ ์—†๋Š”๋ฐ
    1๋กœ ๊ทธ๋Œ€๋กœ ๋†”๋‘๋ฉด ์ค‘๋ณต์œผ๋กœ ๊ณ„์† ๊ฐ™์€ ๊ทธ๋ฆผ์„ ๊ฒ€์‚ฌํ•˜๊ฒŒ ๋˜๋‹ˆ๊นŒ.,,!!)

 

๐Ÿ’ก ํ”ผ๋“œ๋ฐฑ
  • ์ฒ˜์Œ ์ ‘ํ•œ DFS ๋ฌธ์ œ๋ผ์„œ ๋ชจ๋“  ์ž๋ฆฌ๋ฅผ ๊ฒ€์‚ฌํ•ด์•ผํ•˜๋Š”์ค„ ๋ชจ๋ฅด๊ณ 
    ์ด๋ฆฌ์ €๋ฆฌ ํšจ์œจ์ ์ธ ๋ฐฉ์•ˆ์„ ์ƒ๊ฐํ•ด๋ณด๋‹ค๊ฐ€ ๋‹ค๋ฅธ ๋ถ„๋“ค ํ’€์ด๋ฅผ ๊ฒ€์ƒ‰ํ•ด์„œ ํ’€๊ฒŒ๋๋Š”๋ฐ,!
    ๋ชจ๋“  ์ž๋ฆฌ๋ฅผ ์ƒํ•˜์ขŒ์šฐ๋กœ ๊ผผ๊ผผํžˆ ์‚ดํŽด์ค˜์•ผํ•˜๋Š”๊ตฌ๋‚ญ.,.
  • ์•„์ง DFS๊ฐ€ ์ต์ˆ™ํ•˜์ง„ ์•Š์•„์„œ ๋” ํ’€์–ด๋ด์•ผํ• ๋“ฏ.,!@

 


๋ฌธ์ œ

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

๋Œ“๊ธ€