[프로그래머스] 미로 탈출 java

Bong2·2024년 4월 30일
0

알고리즘

목록 보기
7/63

문제 미로탈출

문제 접근
1. bfs로 출발지점에서 레버까지의 최단거리를 구한다
2. 레버까지 가지 못하면 -1 출력
3. 레버에서 출구까지 bfs로 최단거리를 구한 뒤
4. 출발 -> 레버 -> 출구까지의 거리(시간)를 더하여 결과 출력

import java.util.*;

class Solution {
    int n,m;
    public int solution(String[] maps) {
        int answer = 0;

        n = maps.length;
        m = maps[0].length();
        char board[][] = new char[n][m];
        int sx = 0,sy=0;
        int lx = 0,ly = 0;
        int ex = 0,ey = 0;
        
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                board[i][j] = maps[i].charAt(j);
                if(board[i][j] == 'S')
                {
                    sx = i;
                    sy = j;
                }
                else if(board[i][j] == 'L')
                {
                    lx = i;
                    ly = j;
                }else if(board[i][j] == 'E')
                {
                    ex = i;
                    ey = j;
                }
            }
        }
        //레버로 이동
        answer = bfs(sx,sy,lx,ly,board);
        
        if(answer > -1)
        {
            //출구로 이동
            int temp = bfs(lx,ly,ex,ey,board);
            if(temp == -1)
            {
                answer = -1;
            }
            else
                answer+=temp;
        }
        
        return answer;
        
    }
    
    public int bfs(int sx, int sy, int ex, int ey,char [][]board)
    {
        Queue<int []> q = new LinkedList<>();
        boolean visit[][] = new boolean[n][m];
        q.offer(new int[]{sx,sy,0});
        visit[sx][sy] = true;
        
        int dx[] = new int[]{0,1,-1,0};
        int dy[] = new int[]{1,0,0,-1};
        
        while(!q.isEmpty())
        {
            int cnt[] = q.poll();
            
            if(cnt[0] == ex && cnt[1] == ey)
            {
                return cnt[2];
            }
            
            for(int d=0;d<4;d++)
            {
                int nx = cnt[0] + dx[d];
                int ny = cnt[1] + dy[d];
                
                if( 0 <= nx && nx < n && 0 <= ny && ny < m)
                {
                    if(!visit[nx][ny] && board[nx][ny] != 'X')
                    {
                        visit[nx][ny] = true;
                        q.offer(new int[]{nx,ny,cnt[2]+1});
                    }
                }
            }
        }
        
        return -1;
    }
}
profile
자바 백엔드 개발자로 성장하자

0개의 댓글