알고리즘

프로그래머스 - 무인도 여행

최데브 2024. 8. 13. 22:12

이번에도 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)
    }
}
반응형