프로그래머스 코딩테스트 [ 무인도 여행 ]
Github 링크
- 이 문제는 주어진 배열에서 x를 제외한 숫자들의 연속된 부분의 전부 찾아서, 배열에 저장하여 리턴하는 문제다.
- 아래와 같이 그림이 있다고 가정하면 (왼쪽), 결과물은 오른쪽과 같아야 한다.
- 이 문제는 DFS로 푸는것이 제일 좋은 방법이라고 판단했다.
- 각 위치에서 퍼질수 있는 곳으로 계속 퍼지면서 영역을 만들고, 이미 방문한 곳은 체크를 해서 중복 방문을 방지한다.
import Foundation
func solution(_ maps:[String]) -> [Int] {
var newMaps = maps.map{Array($0)}
let row = newMaps.count
let column = newMaps[0].count
let dx = [0,0,-1,1]
let dy = [1,-1,0,0,]
var visitedGraph = Array(repeating: Array(repeating: 0, count: column), count: row)
func dfs (_ currentRow : Int, _ currentColumn : Int) -> Int {
var sum = 0
visitedGraph[currentRow][currentColumn] = 1
if let currrentNum = Int(String(newMaps[currentRow][currentColumn])){
sum += currrentNum
}else{
return 0
}
for i in 0...3{
var newRow = currentRow + dx[i]
var newCol = currentColumn + dy[i]
if newRow >= row || newCol >= column || newRow < 0 || newCol < 0 || visitedGraph[newRow][newCol] == 1{
continue
}
sum += dfs(newRow, newCol)
}
return sum
}
var ans : [Int] = []
for i in 0..<row{
for j in 0..<column{
if (visitedGraph[i][j] == 1 || newMaps[i][j] == "X") {
continue
}else{
ans.append(dfs(i, j))
}
}
}
ans = ans.isEmpty ? [-1] : ans.sorted(by: <)
return ans
}