이번에도 bfs 로 풀었다.
이런 유형의 문제는 조금씩 체크해야하는 조건만 다를뿐 풀이는 비슷비슷한거 같다.
import java.util.*
class Solution {
var dx = listOf(-1,1,0,0)
var dy = listOf(0,0,-1,1)
var r = 0
var c = 0
var answer = mutableListOf<Int>()
var visited = Array(0) { Array(0) { false } }
data class Moving(
var x : Int,
var y : Int
)
fun solution(maps: Array<String>): IntArray {
var map = mutableListOf<MutableList<Char>>()
r = maps.size
c = maps[0].length
visited = Array(r) { Array(c) { false } }
maps.forEach{ st->
var list = mutableListOf<Char>()
st.forEach{ it->
list.add(it)
}
map.add(list)
}
for(i in 0 .. r-1){
for(j in 0 .. c-1){
if(map[i][j] != 'X' && !visited[i][j]){
bfs(i,j,map)
}
}
}
if(answer.isEmpty()) return intArrayOf(-1)
return answer.sorted().toIntArray()
}
fun bfs(x : Int, y : Int , map : MutableList<MutableList<Char>>){
var q : Queue<Moving> = LinkedList()
var cnt = map[x][y].toString().toInt()
visited[x][y] = true
q.add(Moving(
x,y
))
while(q.isNotEmpty()){
var mv = q.poll()
for(i in 0 .. 3){
val nx = mv.x + dx[i]
val ny = mv.y + dy[i]
if(nx >= 0 && nx < r && ny >=0 && ny < c && map[nx][ny] != 'X' &&
!visited[nx][ny]){
q.add(Moving(nx,ny))
visited[nx][ny] = true
cnt += map[nx][ny].toString().toInt()
}
}
}
answer.add(cnt)
}
}
반응형
'알고리즘' 카테고리의 다른 글
프로그래머스 - 문자열 나누기 (0) | 2024.08.17 |
---|---|
프로그래머스 - 크기가 작은 부분 문자열 (0) | 2024.08.14 |
프로그래머스 - 숫자 변환하기 (0) | 2024.08.14 |
프로그래머스 - 둘만의 암호 (0) | 2024.08.13 |
프로그래머스 - 미로탈출 (0) | 2024.08.12 |
프로그래머스 - 카드뭉치 (0) | 2024.08.12 |
프로그래머스 - 혼자서하는 틱택토 (0) | 2024.08.12 |
프로그래머스 - 대충 만든 자판 (0) | 2024.08.11 |