https://school.programmers.co.kr/learn/courses/30/lessons/1844

이 문제는 미로 탐색과 유사한 문제로, 최단 경로를 찾는 문제입니다. 미로에서 최단 경로를 찾기 위해서는 BFS(너비 우선 탐색) 알고리즘을 사용하는 것이 적합합니다. BFS는 가까운 노드부터 탐색을 진행하기 때문에, 최단 경로 문제를 해결하는 데 매우 효율적입니다.
maps[x][y] == 0)은 이동할 수 없고, 벽이 없는 곳(maps[x][y] == 1)으로만 이동할 수 있습니다.import java.util.*;
class Solution {
// 상, 하, 좌, 우 네 방향 탐색을 위한 배열
static int[] dx = {-1, 1, 0, 0}; // 상하
static int[] dy = {0, 0, -1, 1}; // 좌우
public int solution(int[][] maps) {
int n = maps.length; // 행의 크기
int m = maps[0].length; // 열의 크기
// BFS를 이용해 최단 경로 탐색
return bfs(maps, n, m);
}
public int bfs(int[][] maps, int n, int m) {
// 큐를 이용해 BFS 구현, (x, y, 거리)를 저장
Queue<int[]> queue = new LinkedList<>();
queue.offer(new int[]{0, 0, 1}); // 시작점 (0, 0)에서 시작, 거리 1
// 방문 여부 체크 배열
boolean[][] visited = new boolean[n][m];
visited[0][0] = true;
// BFS 탐색 시작
while (!queue.isEmpty()) {
int[] current = queue.poll();
int x = current[0];
int y = current[1];
int dist = current[2];
// 상대 팀 진영에 도착한 경우
if (x == n - 1 && y == m - 1) {
return dist; // 최단 거리 반환
}
// 상, 하, 좌, 우로 이동
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
// 맵을 벗어나지 않고, 방문하지 않았으며, 벽이 아닌 경우
if (nx >= 0 && ny >= 0 && nx < n && ny < m && !visited[nx][ny] && maps[nx][ny] == 1) {
visited[nx][ny] = true;
queue.offer(new int[]{nx, ny, dist + 1}); // 이동 후 거리 +1
}
}
}
// 상대 팀 진영에 도착할 수 없는 경우
return -1;
}
}
dx[]와 dy[] 배열은 상하좌우 네 방향으로의 이동을 표현합니다.bfs() 함수에서 큐(Queue)를 사용해 BFS 탐색을 진행합니다.(0, 0)에서 시작하며, 초기 거리는 1로 설정합니다.queue.offer(new int[]{0, 0, 1}): 큐에 시작 위치 (0, 0)과 초기 거리 1을 넣습니다.poll()로 값을 꺼내, 현재 위치 (x, y)와 거리를 확인합니다.(n-1, m-1)에 도착하면, 현재까지의 이동 거리를 반환합니다.visited 배열로 관리합니다.1을 반환합니다.n은 맵의 행 크기, m은 열 크기이므로 맵의 모든 칸을 방문할 때의 시간 복잡도는 O(n * m)입니다.n * m개의 좌표를 저장할 수 있습니다. 또한 방문 여부를 체크하는 visited 배열도 크기가 n * m입니다.visited 배열은 각 위치의 방문 여부를 저장하여 중복 방문을 방지합니다.이 문제는 BFS 알고리즘을 사용하여 최단 경로를 찾는 문제입니다. BFS는 최단 거리를 찾는 데 매우 적합한 알고리즘이며, 큐를 사용하여 구현합니다. 시간 복잡도는 O(n * m)로, 입력 크기가 최대 100 x 100일 때도 효율적으로 동작할 수 있습니다.