미로탈출

Lee1231234·2023년 4월 14일

코딩테스트

목록 보기
41/95

문제 설명
1 x 1 크기의 칸들로 이루어진 직사각형 격자 형태의 미로에서 탈출하려고 합니다. 각 칸은 통로 또는 벽으로 구성되어 있으며, 벽으로 된 칸은 지나갈 수 없고 통로로 된 칸으로만 이동할 수 있습니다. 통로들 중 한 칸에는 미로를 빠져나가는 문이 있는데, 이 문은 레버를 당겨서만 열 수 있습니다. 레버 또한 통로들 중 한 칸에 있습니다. 따라서, 출발 지점에서 먼저 레버가 있는 칸으로 이동하여 레버를 당긴 후 미로를 빠져나가는 문이 있는 칸으로 이동하면 됩니다. 이때 아직 레버를 당기지 않았더라도 출구가 있는 칸을 지나갈 수 있습니다. 미로에서 한 칸을 이동하는데 1초가 걸린다고 할 때, 최대한 빠르게 미로를 빠져나가는데 걸리는 시간을 구하려 합니다.
미로를 나타낸 문자열 배열 maps가 매개변수로 주어질 때, 미로를 탈출하는데 필요한 최소 시간을 return 하는 solution 함수를 완성해주세요. 만약, 탈출할 수 없다면 -1을 return 해주세요.

a에서부터 b까지 가는 거리를 구하는 BFS문제, 다만 두번 구해야하기때문에 전체를 구해서 문제를 풀려고 했었다. 결과적으로는 시간초과가 걸린다. 길이가 짧기에 가능할줄 알았지만 불가능했다.
따라서 BFS방식을 두번반복해서 값을 구하면 된다.

코드

import java.util.*;
class Solution {
    
    int[] dx ={0,0,1,-1};
    int[] dy = {1,-1,0,0};
    boolean[][] visited;
    public int solution(String[] maps) {
        int[] flag =new int[3]; 
        visited=new boolean[maps.length][maps[0].length()];
        for(int j=0;j<maps.length;j++){
            if(flag[0]!=0) break;
            String m=maps[j];
            for(int i=0;i<m.length();i++){
                if(m.charAt(i)=='L'){
                    flag[0]=j;
                    flag[1]=i;
                    break;
                }
            }
        }
      
        int one=cal(flag,maps,'S');
        visited=new boolean[maps.length][maps[0].length()];
        int two=cal(flag,maps,'E');     
        if(one==-1||two==-1) return -1;
        return one+two;
    }
    public int cal(int[] start,String[] maps,char type){
        visited[start[0]][start[1]] = true; 
        Queue<int[]> queue = new LinkedList<>();
        queue.add(start); 

        while(!queue.isEmpty()){ 
            int[] cur = queue.poll();
            for(int i=0;i<4;i++){
                int nx = cur[0]+dx[i];
                int ny = cur[1]+dy[i];
                if(nx<0||ny<0||nx>=maps.length||ny>=maps[0].length()||maps[nx].charAt(ny)=='X'||visited[nx][ny]) continue;
                if(maps[nx].charAt(ny)==type) return cur[2]+1;
                
                queue.offer(new int[]{nx,ny,cur[2]+1});
                visited[nx][ny]=true;
                
            }
            
        }
        return -1;
    }
    
    
}
profile
not null

0개의 댓글