์๋ ํ์ธ์ ์ ์ธ์ ๋๋ค!
ํ๋ก๊ทธ๋๋จธ์ค์ ์ต๊ทผ ์ถ๊ฐ๋ ์ฐ์ต๋ฌธ์ ์ค ํ๋์ธ ๋ฌด์ธ๋ ์ฌํ์ด๋ผ๋ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์๋๋ฐ์,
๋ฌธ์ ํด๊ฒฐ ์์ด๋์ด๋ฅผ ์ฝ๋๋ก ๊ตฌํํ๋ ๊ฒ์ด ๊ฝค๋ ์ด๋ ค์ ๋ ๋ฌธ์ ์ด๊ธฐ๋ ํ๊ณ , Swift ํ์ด๊ฐ ์์ง ์๋ ๊ฒ ๊ฐ์์ ํ ๋ฒ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํฉ๋๋ค!
๋ฌด์ธ๋์ ์ ๊ตณ์ด ์ฌํ์ ๊ฐ๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ํผ ์์ํด๋ณผ๊ฒ์..ใ
๋ฌธ์ ๋งํฌ
๋ฌธ์ ์ค๋ช
๋ฉ๋ฆฌ๋ ์ฌ๋ฆ์ ๋ง์ ๋ฌด์ธ๋๋ก ์ฌํ์ ๊ฐ๊ธฐ ์ํด ์ง๋๋ฅผ ๋ณด๊ณ ์์ต๋๋ค. ์ง๋์๋ ๋ฐ๋ค์ ๋ฌด์ธ๋๋ค์ ๋ํ ์ ๋ณด๊ฐ ํ์๋ผ ์์ต๋๋ค. ์ง๋๋ 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์ ๋ํด์๋ ๋์ค์ ํ๋ฒ ์ ๋ฆฌํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค!!
'๐ฅ CS > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Algorithm/Swift] ํ๋ก๊ทธ๋๋จธ์ค(Lv.3) - ๊ธฐ์ง๊ตญ ์ค์น (2) | 2023.03.30 |
---|---|
[Algorithm/Swift] ์ด์ง ํ์(Binary Search) (0) | 2023.02.06 |
[Algorithm/Swift] ๋์ ๊ณํ๋ฒ(Dynamic Programming) (2) | 2023.01.11 |
[Algorithm/Swift] ํ๋ก๊ทธ๋๋จธ์ค(Lv.1) - [1์ฐจ] ๋คํธ๊ฒ์ (0) | 2022.12.17 |
[Algorithm/Swift] ํ๋ก๊ทธ๋๋จธ์ค(Lv.1) - ์ต๋๊ณต์ฝ์์ ์ต์๊ณต๋ฐฐ์ (0) | 2022.12.06 |