Bibi's DevLog πŸ€“πŸŽ

[Swift] DFS μ˜ˆμ œμ™€ 풀이 (Softeer μž₯μ• λ¬Ό 인식 ν”„λ‘œκ·Έλž¨) λ³Έλ¬Έ

ν”„λ‘œκ·Έλž˜λ°/μ•Œκ³ λ¦¬μ¦˜ 풀이 Swift

[Swift] DFS μ˜ˆμ œμ™€ 풀이 (Softeer μž₯μ• λ¬Ό 인식 ν”„λ‘œκ·Έλž¨)

λΉ„λΉ„ bibi 2023. 1. 16. 22:47

[Swift] DFS μ˜ˆμ œμ™€ 풀이 (μž₯μ• λ¬Ό 인식 ν”„λ‘œκ·Έλž¨)

Softeer

예제 좜처: Softeer β€œμž₯μ• λ¬Ό 인식 ν”„λ‘œκ·Έλž¨β€ (λ˜λŠ” μ΄μ½”ν…Œ β€œμŒλ£Œμˆ˜ 얼렀먹기” - 더 쉬움)

λ‘˜λ‹€ SwiftλŠ” μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€..γ… 


DFS

  • 깊이 μš°μ„  탐색 = μžμ‹ λ…Έλ“œλΆ€ν„° νƒμƒ‰ν•˜λŠ” 방식.
  • 멀리 μžˆλŠ” λ…Έλ“œλΆ€ν„° νƒμƒ‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜. (κ·Έλž˜ν”„μ—μ„œ κΉŠμ€ 뢀뢄을 μš°μ„ μ μœΌλ‘œ νƒμƒ‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜)
  • λ°©λ¬Έ 처리 : ν•œ 번 μ²˜λ¦¬ν•œ λ…Έλ“œλ₯Ό λ‹€μ‹œ μ²˜λ¦¬ν•˜μ§€ μ•Šλ„λ‘ μ²΄ν¬ν•˜λŠ” 것.
  • μŠ€νƒ μžλ£Œκ΅¬μ‘°μ— κΈ°μ΄ˆν•œλ‹€.
    • μž¬κ·€λ₯Ό μ΄μš©ν•˜λ©΄ κ°„κ²°ν•˜κ²Œ κ΅¬ν˜„ν•  수 μžˆλ‹€.
  • O(n) 의 μ‹œκ°„λ³΅μž‘λ„λ₯Ό 가진닀. (n = λ°μ΄ν„°μ˜ 개수)

❗️DFSλŠ” μŠ€νƒμ„ μ΄μš©ν•˜λ©° μ‹€μ œ κ΅¬ν˜„μ‹œμ—λŠ” μž¬κ·€λ‘œ ν’€ 수 μžˆλ‹€.

문제

μžμœ¨μ£Όν–‰νŒ€ SW μ—”μ§€λ‹ˆμ–΄μΈ λ‹Ήμ‹ μ—κ²Œ μž₯μ• λ¬Όκ³Ό λ„λ‘œλ₯Ό 인식할 수 μžˆλŠ” ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€λΌλŠ” 업무가 μ£Όμ–΄μ‘Œλ‹€.

https://www.softeer.ai/upload/2021/09/20210908_185443092_92369.jpeg

[κ·Έλ¦Ό 1] 지도 μ˜ˆμ‹œ

μš°μ„  [κ·Έλ¦Ό 1]κ³Ό 같이 μ •μ‚¬κ°ν˜• λͺ¨μ–‘μ˜ 지도가 μžˆλ‹€. 1은 μž₯애물이 μžˆλŠ” 곳을, 0은 λ„λ‘œκ°€ μžˆλŠ” 곳을 λ‚˜νƒ€λ‚Έλ‹€.

당신은 이 지도λ₯Ό 가지고 μ—°κ²°λœ μž₯μ• λ¬Όλ“€μ˜ λͺ¨μž„인 블둝을 μ •μ˜ν•˜κ³ , λΆˆλ‘μ— 번호λ₯Ό 뢙이렀 ν•œλ‹€. μ—¬κΈ°μ„œ μ—°κ²°λ˜μ—ˆλ‹€λŠ” 것은 μ–΄λ–€ μž₯애물이 쒌우, ν˜Ήμ€ μ•„λž˜μœ„λ‘œ λΆ™μ–΄ μžˆλŠ” 경우λ₯Ό λ§ν•œλ‹€. λŒ€κ°μ„  상에 μž₯애물이 μžˆλŠ” κ²½μš°λŠ” μ—°κ²°λœ 것이 μ•„λ‹ˆλ‹€.

https://www.softeer.ai/upload/2021/09/20210908_185526817_72681.jpeg

[κ·Έλ¦Ό 2] 블둝 별 번호 λΆ€μ—¬

[κ·Έλ¦Ό 2]λŠ” [κ·Έλ¦Ό 1]을 블둝 λ³„λ‘œ 번호λ₯Ό 뢙인 것이닀.

지도λ₯Ό μž…λ ₯ν•˜μ—¬ μž₯μ• λ¬Ό λΈ”λ‘μˆ˜λ₯Ό 좜λ ₯ν•˜κ³ , 각 블둝에 μ†ν•˜λŠ” μž₯μ• λ¬Όμ˜ 수λ₯Ό μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•˜μ—¬ 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μ œμ•½μ‘°κ±΄

N은 μ •μ‚¬κ°ν˜•μž„μœΌλ‘œ κ°€λ‘œμ™€ μ„Έλ‘œμ˜ ν¬κΈ°λŠ” κ°™μœΌλ©° 5 ≀ N ≀ 25

μž…λ ₯ν˜•μ‹

μž…λ ₯ κ°’μ˜ 첫 번째 μ€„μ—λŠ” μ§€λ„μ˜ 크기 N이 μž…λ ₯되고, κ·Έ λ‹€μŒ Nμ€„μ—λŠ” 각각 N개의 자료(0ν˜Ήμ€ 1)κ°€ μž…λ ₯λœλ‹€.

좜λ ₯ν˜•μ‹

첫 번째 μ€„μ—λŠ” 총 블둝 수λ₯Ό 좜λ ₯ ν•˜μ‹œμ˜€.

그리고 각 블둝 λ‚΄ μž₯μ• λ¬Όμ˜ 수λ₯Ό μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•˜μ—¬ ν•œ 쀄에 ν•˜λ‚˜μ”© 좜λ ₯ν•˜μ‹œμ˜€.

μž…λ ₯예제1

7
1110111
0110101
0110101
0000100
0110000
0111110
0110000

좜λ ₯예제1

3
7
8
9

SwiftλŠ” 채점이 μ•ˆλ˜κΈ° λ•Œλ¬Έμ— μ•„λž˜μ™€ 같이 μž…λ ₯이 λ“€μ–΄μ˜¨λ‹€κ³  κ°€μ •ν•˜κ³  ν’€μ–΄ λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

q409(n: 7, graph: [
    [1,1,1,0,1,1,1],
    [0,1,1,0,1,0,1],
    [0,1,1,0,1,0,1],
    [0,0,0,0,1,0,0],
    [0,1,1,0,0,0,0],
    [0,1,1,1,1,1,0],
    [0,1,1,0,0,0,0]
])
func q409(n: Int, graph: [[Int]]) { // μž₯μ• λ¬Ό 인식 ν”„λ‘œκ·Έλž¨
    var graph = graph
    var bumps: [Int] = []
    var bumpLength = 0

    func dfs(x: Int, y: Int) -> Bool {

        // xμ’Œν‘œμ™€ yμ’Œν‘œκ°€ 주어진 λ²”μœ„λ₯Ό λ„˜μ–΄κ°€λ©΄ μ¦‰μ‹œ μ’…λ£Œ
        if x >= n || y >= n || x < 0 || y < 0 {
            return false
        }
        if graph[x][y] == 1 { // μ„Έμ•Ό ν•˜λŠ” λŒ€μƒ (μž₯μ• λ¬Ό = 1)
            graph[x][y] = 0 // λ°©λ¬Έν•œ λŒ€μƒμ€ 0으둜 λ°”κΏ”μ€Œ
            bumpLength += 1

            // ν•΄λ‹Ή λ…Έλ“œμ˜ μƒν•˜μ’Œμš° λ…Έλ“œμ— λŒ€ν•΄μ„œλ„ λͺ¨λ‘ μž¬κ·€ν˜ΈμΆœ
            dfs(x: x - 1, y: y) 
            dfs(x: x + 1, y: y)
            dfs(x: x, y: y - 1)
            dfs(x: x, y: y + 1)
            return true
        }
        return false
    }

    // 주어진 λ²”μœ„μ˜ λͺ¨λ“  μ’Œν‘œ 확인 μ‹œμž‘
    for x in (0..<n) {
        for y in (0..<n) {
            // ν˜„μž¬ μœ„μΉ˜μ—μ„œ DFS μˆ˜ν–‰
            if dfs(x: x, y: y) == true {
                bumps.append(bumpLength)
                bumpLength = 0
            }
        }
    }

    print(bumps.count)
    bumps.sorted().forEach{ print($0) }
}

DFS의 핡심은 ν˜„μž¬ νƒμƒ‰ν•˜λŠ” μ’Œν‘œμ˜ μ£Όλ³€ (μ—¬κΈ°μ„œλŠ” μƒν•˜μ’Œμš°) μ’Œν‘œλ₯Ό μž¬κ·€μ μœΌλ‘œ νƒμƒ‰ν•œλ‹€λŠ” 것이닀.

깊이 μš°μ„  탐색을 μž¬κ·€λ‘œ κ΅¬ν˜„ν•œλ‹€κ³  μ΄ν•΄ν•˜λ©΄ 될 것 κ°™λ‹€.