문제 미로탈출
문제 접근
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;
}
}