๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ–ฅ CS/Algorithm

[Algorithm/Swift] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค(Lv.2) - ๋ฌด์ธ๋„ ์—ฌํ–‰

์•ˆ๋…•ํ•˜์„ธ์š” ์ œ์ธ์ž…๋‹ˆ๋‹ค!

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์— ์ตœ๊ทผ ์ถ”๊ฐ€๋œ ์—ฐ์Šต๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜์ธ ๋ฌด์ธ๋„ ์—ฌํ–‰์ด๋ผ๋Š” ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด์•˜๋Š”๋ฐ์š”,

๋ฌธ์ œ ํ•ด๊ฒฐ ์•„์ด๋””์–ด๋ฅผ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ฝค๋‚˜ ์–ด๋ ค์› ๋˜ ๋ฌธ์ œ์ด๊ธฐ๋„ ํ•˜๊ณ , Swift ํ’€์ด๊ฐ€ ์•„์ง ์—†๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ํ•œ ๋ฒˆ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค!

๋ฌด์ธ๋„์— ์™œ ๊ตณ์ด ์—ฌํ–‰์„ ๊ฐ€๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์•”ํŠผ ์‹œ์ž‘ํ•ด๋ณผ๊ฒŒ์š”..ใ…Ž

๋ฌธ์ œ ๋งํฌ

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

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

programmers.co.kr

๋ฌธ์ œ ์„ค๋ช…

๋ฉ”๋ฆฌ๋Š” ์—ฌ๋ฆ„์„ ๋งž์•„ ๋ฌด์ธ๋„๋กœ ์—ฌํ–‰์„ ๊ฐ€๊ธฐ ์œ„ํ•ด ์ง€๋„๋ฅผ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๋„์—๋Š” ๋ฐ”๋‹ค์™€ ๋ฌด์ธ๋„๋“ค์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํ‘œ์‹œ๋ผ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๋„๋Š” 1 x 1ํฌ๊ธฐ์˜ ์‚ฌ๊ฐํ˜•๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ์ง์‚ฌ๊ฐํ˜• ๊ฒฉ์ž ํ˜•ํƒœ์ด๋ฉฐ, ๊ฒฉ์ž์˜ ๊ฐ ์นธ์—๋Š” 'X' ๋˜๋Š” 1์—์„œ 9 ์‚ฌ์ด์˜ ์ž์—ฐ์ˆ˜๊ฐ€ ์ ํ˜€์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๋„์˜ 'X'๋Š” ๋ฐ”๋‹ค๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ˆซ์ž๋Š” ๋ฌด์ธ๋„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด๋•Œ, ์ƒ, ํ•˜, ์ขŒ, ์šฐ๋กœ ์—ฐ๊ฒฐ๋˜๋Š” ๋•…๋“ค์€ ํ•˜๋‚˜์˜ ๋ฌด์ธ๋„๋ฅผ ์ด๋ฃน๋‹ˆ๋‹ค. ์ง€๋„์˜ ๊ฐ ์นธ์— ์ ํžŒ ์ˆซ์ž๋Š” ์‹๋Ÿ‰์„ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ, ์ƒ, ํ•˜, ์ขŒ, ์šฐ๋กœ ์—ฐ๊ฒฐ๋˜๋Š” ์นธ์— ์ ํžŒ ์ˆซ์ž๋ฅผ ๋ชจ๋‘ ํ•ฉํ•œ ๊ฐ’์€ ํ•ด๋‹น ๋ฌด์ธ๋„์—์„œ ์ตœ๋Œ€ ๋ฉฐ์น ๋™์•ˆ ๋จธ๋ฌผ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์–ด๋–ค ์„ฌ์œผ๋กœ ๋†€๋Ÿฌ ๊ฐˆ์ง€ ๋ชป ์ •ํ•œ ๋ฉ”๋ฆฌ๋Š” ์šฐ์„  ๊ฐ ์„ฌ์—์„œ ์ตœ๋Œ€ ๋ฉฐ์น ์”ฉ ๋จธ๋ฌผ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณธ ํ›„ ๋†€๋Ÿฌ๊ฐˆ ์„ฌ์„ ๊ฒฐ์ •ํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค.

์ง€๋„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด ๋ฐฐ์—ด maps๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๊ฐ ์„ฌ์—์„œ ์ตœ๋Œ€ ๋ฉฐ์น ์”ฉ ๋จธ๋ฌด๋ฅผ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ฐฐ์—ด์— ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋‹ด์•„ return ํ•˜๋Š” solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”. ๋งŒ์•ฝ ์ง€๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ฌด์ธ๋„๊ฐ€ ์—†๋‹ค๋ฉด -1์„ ๋ฐฐ์—ด์— ๋‹ด์•„ return ํ•ด์ฃผ์„ธ์š”.

์ œํ•œ ์‚ฌํ•ญ

  • 3 ≤ maps์˜ ๊ธธ์ด ≤ 100
    • 3 ≤ maps[i]์˜ ๊ธธ์ด ≤ 100
    • maps[i]๋Š” 'X' ๋˜๋Š” 1 ๊ณผ 9 ์‚ฌ์ด์˜ ์ž์—ฐ์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
    • ์ง€๋„๋Š” ์ง์‚ฌ๊ฐํ˜• ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

 maps  result
 ["X591X","X1X5X","X231X", "1XXX1"]  [1, 1, 27]
 ["XXX","XXX","XXX"]  [-1]

์ž…์ถœ๋ ฅ ์˜ˆ ์„ค๋ช…

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

์œ„ ๋ฌธ์ž์—ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ง€๋„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์—ฐ๊ฒฐ๋œ ๋•…๋“ค์˜ ๊ฐ’์„ ํ•ฉ์น˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์œผ๋ฉฐ

์ด๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋ฉด [1, 1, 27]์ด ๋ฉ๋‹ˆ๋‹ค.

 

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

์œ„ ๋ฌธ์ž์—ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ง€๋„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์„ฌ์ด ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— -1์„ ๋ฐฐ์—ด์— ๋‹ด์•„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ ํ’€์ด

์ž…์ถœ๋ ฅ ์˜ˆ์‹œ๊ฐ€ ๊ทธ๋ฆผ์œผ๋กœ ์ž˜ ์„ค๋ช…์ด ๋˜์–ด์žˆ์–ด ๋ฌธ์ œ๋ฅผ ๋นจ๋ฆฌ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์€ ์ง€๋„์—์„œ ์—ฐ๊ฒฐ๋˜๋Š” ๋•…์„ ์ฐพ๋Š” ๊ฒƒ์ธ๋ฐ์š”, ์—ฐ๊ฒฐ๋œ ๋•…์„ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ DFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ ํ•ฉํ•  ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์ œ๊ฐ€ DFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•ด ๋ฌธ์ œ๋ฅผ ํ’€์ดํ•œ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

1. ์ฃผ์–ด์ง„ maps ๋ฐฐ์—ด์„ [[Int]] ํƒ€์ž…์˜ 2์ฐจ์› ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค๊ธฐ

maps ๋ฐฐ์—ด์€ [String] ํƒ€์ž…์œผ๋กœ ์ฃผ์–ด์ง€๋Š”๋ฐ์š”, ์ง€๋„๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” maps[i] ๋˜ํ•œ ๋ฐฐ์—ด๋กœ ๋ฐ”๊พธ์–ด ์ „์ฒด ์ง€๋„๊ฐ€ 2์ฐจ์› ๋ฐฐ์—ด ํ˜•ํƒœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์—ฌ 2์ฐจ์› ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ ์ขŒํ‘œ๊ฐ’์œผ๋กœ ์ด์šฉํ•ด ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๊ณ , ์–ด์ฐจํ”ผ ๊ตฌํ•ด์•ผ ํ•˜๋Š” ๊ฐ’์€ ์—ฐ๊ฒฐ๋œ ๋•…์˜ ์ˆซ์ž๋ฅผ ๋”ํ•œ ๊ฒฐ๊ณผ๊ฐ’๋“ค์ด๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ์‚ฐ์ด ์‰ฝ๋„๋ก maps[i]๋ฅผ [Int]ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. (๋ฌด์ธ๋„์— ๋“ค์–ด๊ฐ€๋Š” ์ˆซ์ž๋Š” 1~9์ด๊ธฐ ๋•Œ๋ฌธ์— ์ง€๋„์—์„œ ๋ฐ”๋‹ค๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” 'X'๋Š” 0์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.)

 

2. ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ [[Bool]] ํƒ€์ž…์˜ visited ๋ฐฐ์—ด ๋งŒ๋“ค๊ธฐ

์ง€๋„๋ฅผ dfsํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํƒ์ƒ‰ํ•˜๊ฒŒ ๋ ํ…๋ฐ, ์ด ํƒ์ƒ‰ ๊ณผ์ •์—์„œ ์ธ์ ‘ํ•œ ๋ชจ๋“  ๋ฌด์ธ๋„๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ณ  ๋ฐฉ๋ฌธํ•œ ๋ฌด์ธ๋„์˜ ๊ฐ’์˜ ํ•ฉ์„ result์— ์‚ฝ์ž…ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์ขŒํ‘œ์ธ์ง€ ์•„๋‹Œ์ง€ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— 1์—์„œ ๋งŒ๋“  2์ฐจ์› ๋ฐฐ์—ด๊ณผ ๋™์ผํ•œ ํฌ๊ธฐ์˜ [[Bool]] ํƒ€์ž…์˜ visited ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

 

3. dfs ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ 

์ง€๋„๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ์ธ์ ‘ํ•œ ๋ชจ๋“  ๋ฌด์ธ๋„๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ณ  ๋ฌด์ธ๋„์˜ ์›์†Œ์˜ ๊ฐ’์˜ ํ•ฉ์„ ๋ฆฌํ„ดํ•ด์ฃผ๋Š” dfs ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

dfs ํ•จ์ˆ˜๋Š” ํ˜„์žฌ ์ขŒํ‘œ์—์„œ ์ƒํ•˜์ขŒ์šฐ๋กœ ์ด๋™ํ•˜๋ฉฐ ๋ฌด์ธ๋„๋ฅผ ์ฐจ๋ก€๋กœ ๋ฐฉ๋ฌธํ•˜๋ฉฐ, ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ํ•œ ๋ฌด์ธ๋„๊ฐ€ ๋” ์ด์ƒ ์—†์„ ๊ฒฝ์šฐ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

 

4. ์ง€๋„ ์ˆœํšŒํ•˜๋ฉฐ result ๊ฐ’ ๊ณ„์‚ฐํ•˜๊ธฐ

dfs ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์„ ํ†ตํ•ด ์ง€๋„๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ๋ฐ˜ํ™˜ ๊ฐ’์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

Swift ํ’€์ด ์ฝ”๋“œ

import Foundation

var mapArr = [[Int]]()
var visited = [[Bool]]()

func solution(_ maps: [String]) -> [Int] {
    var result: [Int] = []
    mapArr = Array(repeating: [], count: maps.count)
    visited = Array(repeating: Array(repeating: false, count: maps[0].count), count: maps.count)
    
    // maps [[Int]] ํƒ€์ž…์œผ๋กœ ๋ฐ”๊พธ๊ธฐ
    for i in 0..<maps.count {
        for j in maps[i] {
            if j == "X" {
                mapArr[i].append(0)
            } else {
                mapArr[i].append(Int(String(j))!)
            }
        }
    }
    
    // ์ง€๋„ ์ˆœํšŒ
    for i in 0..<mapArr.count {
        var sum = 0
        for j in 0..<mapArr[i].count {
            sum = dfs(i, j, &visited, mapArr)
            if sum > 0 {
                result.append(sum)
            }
        }
    }

    return result.isEmpty ? [-1] : result.sorted(by: <)
}

// ์—ฐ๊ฒฐ๋œ ๋•…๋“ค์˜ ์›์†Œ๋ฅผ ๋”ํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
func dfs(_ i: Int, _ j: Int, _ visited: inout [[Bool]], _ arr: [[Int]]) -> Int {
    
    // ์ง€๋„ ์˜์—ญ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜ ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์ขŒํ‘œ์ด๊ฑฐ๋‚˜ ๋ฐ”๋‹ค์ธ ๊ฒฝ์šฐ ์ข…๋ฃŒ
    if i < 0 || j < 0 || i >= visited.count || j >= visited[0].count
        || visited[i][j] || arr[i][j] == 0 { return 0 }
    
    visited[i][j] = true // ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
    
    return arr[i][j] + dfs(i-1, j, &visited, mapArr) + dfs(i+1, j, &visited, mapArr) + dfs(i, j-1, &visited, mapArr) + dfs(i, j+1, &visited, mapArr)
}

 

์œ„์˜ ๋ฌธ์ œ ํ’€์ด ๊ณผ์ •์„ Swift ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ์œ„์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๋‚˜๋‹ˆ dfs ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ™œ์šฉํ•œ ์ „ํ˜•์ ์ธ ํƒ์ƒ‰ ๋ฌธ์ œ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“œ๋Š”๋ฐ์š”, ์•„์ด๋””์–ด๋ฅผ ์ฝ”๋“œ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ณผ์ •์ด ์‰ฝ์ง€ ์•Š์•˜๋˜ ๊ฒƒ ๊ฐ™์•„ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ๋ฌธ์ œ๋ฅผ ๋งŽ์ด ์—ฐ์Šตํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“œ๋„ค์š”๐Ÿฅฒ

 

๊ทธ๋ฆฌ๊ณ  dfs ํ•จ์ˆ˜์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์€ visited ๋ฐฐ์—ด์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด inout ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ์—ˆ๋Š”๋ฐ์š”, 

Value ํƒ€์ž…์˜ ๊ฐ’์„ Reference ํƒ€์ž…์˜ ๊ฐ’์ฒ˜๋Ÿผ ์ฐธ์กฐ๋กœ ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์ธ In-Out Parameters์— ๋Œ€ํ•ด์„œ๋„ ๋‚˜์ค‘์— ํ•œ๋ฒˆ ์ •๋ฆฌํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!!