Potato
μ•ˆλ…•ν•˜μ„Έμš”, κ°μž‘λ‹ˆλ‹€?πŸ₯” ^___^ 😺 github λ°”λ‘œκ°€κΈ° πŸ‘‰πŸ»

Algorithm/Baekjoon

[λ°±μ€€] (Swift) 14716번 - ν˜„μˆ˜λ§‰ (싀버1, DFS)

감자 πŸ₯” 2023. 2. 28. 15:24
λ°˜μ‘ν˜•

λΉ„μŠ·ν•œ μœ ν˜•μ˜ λ¬Έμ œκ°€ λŒλ €μ„œ λ‚˜μ˜¨λ‹€λŠ” 말에 κ³΅κ°ν•˜λŠ” μš”μ¦˜,,, 
더 λ‹€μ–‘ν•œ μœ ν˜•μ˜ 문제λ₯Ό 풀어보기 μœ„ν•΄μ„œ λ…Έλ ₯ν•΄μ•Όκ²Ÿλ‹€! 그리고 ν•˜λ£¨μ— 2문제만 ν‘ΈλŠ”κ±΄ λ„ˆλ¬΄ μ μœΌλ‹ˆ, μ΅œμ†Œ 3문제 이상은 ν’€μ–΄μ•Όκ²Ÿλ‹€.
μ•„μ’Œμ’Œ ν™”μ΄νŒ…

 

⚫️ 문제

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

 

14716번: ν˜„μˆ˜λ§‰

ν˜μ§„μ΄μ˜ μƒκ°λŒ€λ‘œ ν”„λ‘œκ·Έλž¨μ„ κ΅¬ν˜„ν–ˆμ„ λ•Œ, ν˜„μˆ˜λ§‰μ—μ„œ κΈ€μžμ˜ κ°œμˆ˜κ°€ λͺ‡ κ°œμΈμ§€ 좜λ ₯ν•˜μ—¬λΌ.

www.acmicpc.net

⚫️ λ‚˜μ˜ 풀이

μ•„λ‹ˆ,,, μ΄μ½”ν…Œ 음료수 얼리기, ν˜Ήμ€ 방금 전에 ν’€μ–΄λ³Έ λ°±μ€€ μ–‘λ¬Έμ œ... λ“±λ“± λ„ˆλ¬΄λ„ˆλ¬΄ λΉ„μŠ·ν•œ μœ ν˜•μ˜ λ¬Έμ œλ“€μ΄λ‹€. 이런 문제 μœ ν˜•μ€ 정말 잘 ν’€μˆ˜ μž‡μ„κ²ƒκ°™λ‹€λŠ” μžμ‹ κ°μ΄ 마ꡬ μƒ˜μ†ŸλŠ”λ‹€. 이제 DFS κ΄€λ ¨ν•΄μ„œ λ‹€λ₯Έ μœ ν˜•μ˜ 문제λ₯Ό 풀어봐야겠닀.

문제λ₯Ό 보자마자, κ·Έλƒ₯ DFSλŒλ €μ„œ κΈ€μžκ°€ μžˆλŠ” 뢀뢄을 νƒμƒ‰ν•΄μ£ΌλŠ” 방식을 생각햇닀. 그리고 κΈ€μžκ°€ μžˆλŠ”κ³³μ„ λ°©λ¬Έν•˜λ©΄ μ „λΆ€ 방문처리λ₯Ό ν•΄μ€˜λ²„λ¦¬λŠ” 것이지 ... λ”±νžˆ depthλ‚˜ μ˜μ—­μ΄ μ–Όλ§ˆλ‚˜ μ»€μ‘ŒλŠ”μ§€μ— λŒ€ν•œ μ²˜λ¦¬κ°€ ν•„μš”ν•˜μ§€ μ•Šμ€ κ°„λ‹¨ν•œ λ¬Έμ œλ‹€.

문제λ₯Ό μ–΄λ–»κ²Œ ν’€μ—ˆλŠ”μ§€ 그림으둜 κ·Έλ €μ„œ μƒκ°ν•˜λŠ” μŠ΅κ΄€μ„ ν˜•μ„±ν•˜κΈ° μœ„ν•΄μ„œ 항상 μ•„μ΄νŒ¨λ“œλ₯Ό 가지고 λ‹€λ‹ˆλ©΄μ„œ μ•„λž˜μ²˜λŸΌ μž‘μ„±ν•˜κ³  μ½”λ“œλ₯Ό μž‘μ„±ν•œλ‹€. μ΄λ ‡κ²Œ ν•˜κ²Œ 되면 λ‚˜μ€‘μ— μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄μ„œ 생각이 덜 κΌ¬μ΄λŠ” 것 κ°™λ‹€.

 

⚫️ μ •λ‹΅μ½”λ“œ

import Foundation

let mn = readLine()!.split(separator: " ").map{ Int($0)! }

var banner = [[Int]]()
for _ in 0..<mn[0] {
    banner.append(readLine()!.split(separator: " ").map{ Int($0)! })
}

var cnt = 0

// λ°©ν–₯ν‚€ : 상 ν•˜ 쒌 우 μ™Όμͺ½μœ„ μ™Όμͺ½μ•„λž˜ 였λ₯Έμͺ½μœ„ 였λ₯Έμͺ½μ•„λž˜
let dx = [-1, 1, 0, 0, -1, 1, -1, 1]
let dy = [0, 0, -1, 1, -1, -1, 1, 1]

private func dfs(x: Int, y: Int) {
    banner[x][y] = 0

    for i in 0..<8 {
        let nx = x + dx[i]
        let ny = y + dy[i]

        if nx < 0 || ny < 0 || nx >= mn[0] || ny >= mn[1] {
            continue
        }

        if banner[nx][ny] == 1 {
            dfs(x: nx, y: ny)
        }
    }
}

for i in 0..<mn[0] {
    for j in 0..<mn[1] {
        if banner[i][j] == 1 {
            cnt += 1
            dfs(x: i, y: j)
        }
    }
}

print(cnt)
λ°˜μ‘ν˜•