https://school.programmers.co.kr/learn/courses/30/lessons/154540
-> 각 섬에서 최대 며칠씩 머무를 수 있는지를 return
Input)
maps: Array<String>
Output)
answer: IntArray
전체 흐름 코드 (dfs 생략)
fun solution(maps: Array<String>): IntArray {
val height = maps.size
val width = maps[0].length
//1-2
val numMap = Array(height) { Array<Pair<Int, Boolean>>(width) { Pair(0, false) } }
//1-3
val numToCount = mutableMapOf<Int, Int>()
var lastNum = 0
//from:
//1:왼쪽, 2:위, 3:오른쪽, 4:아래쪽
/**dfs(row: Int, column: Int, from: Int) 생략**/
for(r in 0 until height) {
for(c in 0 until width) {
if(!numMap[r][c].second && numMap[r][c].first == 0 && maps[r][c] != 'X') {
lastNum++
dfs(r,c, 5)
}
}
}
if(lastNum == 0) return intArrayOf(-1)
val answer = IntArray(lastNum) { 0 }
//2-3
val sorted = numToCount.toList().sortedBy { it.second }
for(i in 0 until lastNum) {
answer[i] = sorted[i].second
}
return answer
}
dfs 코드
//from
//왼쪽: 1, 위: 2, 오른쪽: 3, 아래: 4
fun dfs(row: Int, column: Int, from: Int) {
val pair = numMap[row][column]
//2-2
if(pair.first == -1 || pair.first != 0) return
val ele = maps[row][column]
when(ele) {
//2-1
'X' -> {
numMap[row][column] = Pair(-1, true)
return
}
else -> {
numMap[row][column] = Pair(lastNum, true)
numToCount[lastNum] = numToCount.getOrPut(lastNum) {0} + ele.digitToInt()
if(from != 1 && column != 0) {
dfs(row, column-1, 3)
}
if(from != 2 && row != 0) {
dfs(row-1, column, 4)
}
if(from != 3 && column != width-1) {
dfs(row, column+1, 1)
}
if(from != 4 && row != height-1) {
dfs(row+1, column, 2)
}
}
}
}
작성하다 보니 바다 지역 번호 값(pair.first)을 -1로 굳이 안해도 될것 같다.