[프로그래머스] 미로탈출 - JAVA
https://school.programmers.co.kr/learn/courses/30/lessons/67259
풀이
미로를 탈출하는데 레버에 먼저 들리고 출구로 가야한다.
즉, 출발지 -> 레버, 레버 -> 출구 2차례 그래프 탐색으로 최솟값을 구하면 된다.
bfs탐색을 통해 두 함수의 최솟값을 구해줬다.
메모리: 77.3MB
시간: 0.42ms
언어: Java 11
코드
import java.util.*;
class Solution {
static class Point {
int r;
int c;
int time;
public Point(int r, int c, int time) {
this.r = r;
this.c = c;
this.time = time;
}
}
static char[][] board;
static int answer;
static int[][] vector = { { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 } };
public int solution(String[] maps) {
board = new char[maps.length][maps[0].length()];
int sr = 0;
int sc = 0;
for (int i = 0; i < maps.length; i++) {
for (int j = 0; j < maps[0].length(); j++) {
board[i][j] = maps[i].charAt(j);
if (board[i][j] == 'S') {
sr = i;
sc = j;
}
}
}
answer = findRoute(sr, sc, 'L');
return answer;
}
private static int findRoute(int r, int c, char goal) {
Queue<Point> queue = new LinkedList<>();
boolean[][] visit = new boolean[board.length][board[0].length];
visit[r][c] = true;
queue.add(new Point(r, c, 0));
while (!queue.isEmpty()) {
Point curr = queue.poll();
if (board[curr.r][curr.c] == goal) {
if (goal == 'L') {
int f = findRoute(curr.r, curr.c, 'E');
if (f == -1) {
return -1;
} else {
return curr.time + f;
}
} else {
return curr.time;
}
}
for (int i = 0; i < 4; i++) {
int nr = curr.r + vector[i][0];
int nc = curr.c + vector[i][1];
if (nr < 0 || nc < 0 || nr >= board.length || nc >= board[0].length || board[nr][nc] == 'X'
|| visit[nr][nc]) {
continue;
}
queue.add(new Point(nr, nc, curr.time + 1));
visit[nr][nc] = true;
}
}
return -1;
}
}