대표적인 BFS
문제 미로 탐색 문제였다.
dx, dy
를 통해서 좌표 접근을 하고, BFS
로 최단 거리를 탐색하면 된다.
살짝 막혔던 부분이 있었는데,
최단 거리를 어떻게 계산할까 되게 복잡하게 생각하고 있었다.
근데 풀이 방법은 간단하게 다음 이동 경로에 기존의 값에 1씩을 더해주면 되는 간단한 문제였다.
그렇게 하면 최단 거리가 아닌 길을 들르더라도 결국 마지막 n,m
에서 최단 거리를 구할 수 있게 된다.
ArrayDeque
는 Queue
의 서브인터페이스인 Deque
의 구현체이고, LinkedList
는 List
와 Queue
의 구현체이다. 그래서 LinkedList
는 List
의 특징, ArrayDeque
는 배열의 특징을 가지고 있다.
ArrayDeque
는 배열의 측면으로 삽입/삭제 연산의 시간 복잡도가 이므로 성능이 우수하다. 또한 Random access가 가능하기에 조회 시에도 속도가 빠르다.
LinkedList
도 삽입/삭제 연산 성능이 좋지만, 특정 원소에 접근 시는 ArrayDeque
에 비해 떨어진다.
ArrayDeque
은 LinkedList
와 달리 다음 노드에 대한 참조를 유지할 필요가 없기 때문에 더 적은 메모리를 사용한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int[][] map;
static int[] dx = {0,0,-1,1};
static int[] dy = {1,-1,0,0};
static boolean[][] visited;
static int n,m;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
map = new int[n+1][m+1];
visited = new boolean[n+1][m+1];
for(int i=1;i<=n;i++){
String str = br.readLine();
for(int j=1;j<=m;j++){
map[i][j] = Integer.parseInt(String.valueOf(str.charAt(j-1)));
}
}
bfs(1,1);
System.out.println(map[n][m]);
}
private static void bfs(int x, int y) {
Queue<int[]> queue = new ArrayDeque<>();
queue.add(new int[] {x,y});
visited[x][y] = true;
while(!queue.isEmpty()) {
int[] q = queue.remove();
int nx = q[0];
int ny = q[1];
for (int i = 0; i < 4; i++) {
int mx = nx + dx[i];
int my = ny + dy[i];
if (mx > 0 && my > 0 && mx <= n && my <= m) {
if (!visited[mx][my] && map[mx][my] != 0) {
queue.add(new int[]{mx, my});
visited[mx][my] = true;
//다음 값에 이전 값의 1을 더해줘서 최단거리 계산
map[mx][my] = map[nx][ny] + 1;
}
}
}
}
}
}