알고리즘 문제/백준
[백준] 2178번: 미로 탐색
Lpromotion
2024. 7. 20. 23:36
💡문제 분석 요약
N x M 크기의 미로에서 (1, 1)에서 (N, M)까지 이동하는데 필요한 최소의 칸 수를 구하는 문제이다.
- 시간 제한: 1초
- 메모리 제한: 192MB
💡알고리즘 설계
- 줄의 개수 N, 칸의 개수 M 를 입력받고, (N, M)의 미로 정보를 입력받는다.
- BFS 메서드를 호출하여 미로를 탐색한다.
- BFS 메서드
- `Queue<int[]>` 타입의 큐를 생성한다. (탐색할 좌표를 저장함)
- 시작 위치 (1, 1)를 큐에 넣는다.
- 큐가 빌 때까지:
- 큐의 맨 앞의 값을 꺼낸다. ⇒ 현재 위치 (`cur`)
- `cur`의 상하좌우를 탐색한다.
- 탐색 위치 (x, y)가 미로의 범위에 속하고, 이동 가능한 경로 (`graph[x][y] = 1`)일 경우
- 해당 위치를 큐에 넣는다.
- 해당 위치를 방문 처리한다. (`graph[x][y] = 0`)
- 해당 위치의 시간을 현재 위치의 시간 +1로 저장한다.
- (N, M) 위치의 시간을 반환한다.
💡코드
import java.io.*;
import java.util.*;
public class Main {
static int N, M;
static int[][] graph;
static int[][] time;
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
static void bfs() {
Queue<int[]> q = new ArrayDeque<>();
q.offer(new int[]{1, 1});
while(!q.isEmpty()) {
int[] cur = q.poll();
for(int i=0; i<4; i++) {
int x = dx[i] + cur[0];
int y = dy[i] + cur[1];
if(x > 0 && x<=N && y > 0 && y <= M && graph[x][y] == 1) {
q.offer(new int[]{x, y});
graph[x][y] = 0;
time[x][y] = time[cur[0]][cur[1]] + 1;
}
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] str = br.readLine().split(" ");
N = Integer.parseInt(str[0]);
M = Integer.parseInt(str[1]);
graph = new int[N+1][M+1];
time = new int[N+1][M+1];
time[1][1] = 1;
for(int i=1; i<=N; i++) {
String info = br.readLine();
for(int j=1; j<=M; j++) {
graph[i][j] = Character.getNumericValue(info.charAt(j-1));
}
}
bfs();
System.out.println(time[N][M]);
}
}
💡시간복잡도
줄의 개수가 N, 칸의 개수가 M일 때 시간복잡도는 $O(N*M)$ 이다.
💡 느낀점 or 기억할정보
이전에 풀었던 “유기농 배추”, “숨바꼭질” 문제와 비슷해서 쉽게 풀 수 있었다. 최소 이동 시간을 구할 때는 BFS 이용하기!
반응형