Algorithm/Java

[백준/Java] 2178번 : 미로 탐색

_윤 2024. 3. 13. 20:19
728x90

[문제]

N×M크기의 배열로 표현되는 미로가 있다.

미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다. 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 프로그램을 작성하시오. 한 칸에서 다른 칸으로 이동할 때, 서로 인접한 칸으로만 이동할 수 있다.

위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 수 있다. 칸을 셀 때에는 시작 위치와 도착 위치도 포함한다.

[조건]

  • 시간 제한 : 1초
  • 메모리 제한 : 192MB

[입력]

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

[출력]

첫째 줄에 지나야 하는 최소의 칸 수를 출력한다. 항상 도착위치로 이동할 수 있는 경우만 입력으로 주어진다.

[문제 풀이]

  • (0, 0)가 항상 시작점이므로 arr[0][0] =1로 설정 (arr[r][c]==0이면 방문하지 않은 곳으로 볼 것이라)
  • 이후 미로를 통과할 수 있다면 queue.peek()에 해당하는 배열에 들어있는 값보다 +1함
  • (N-1, M-1)가 항상 도착점이므로 arr[N-1][M-1] 출력
import java.io.*;
import java.util.*;

class miro{
	int r;
	int c;
	
	miro(int r, int c){
		this.r = r;
		this.c = c;
	}
}

public class boj_2178_미로탐색 {
	static BufferedReader br;
    static StringTokenizer st;
    static StringBuilder sb = new StringBuilder();
    public static void main(String[] args) throws IOException {
        br = new BufferedReader(new InputStreamReader(System.in));
        st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        int[][] arr = new int[N][M];
        for(int r=0; r<N; r++) {
            String str = br.readLine();
            for(int c=0; c<M; c++) {
                arr[r][c] = str.charAt(c)-'1';
            }
        }
        
        int[] dr = {-1, 1, 0, 0};
        int[] dc = {0, 0, -1, 1};
        Queue<miro> queue = new LinkedList<>();
        
        queue.add(new miro(0, 0));
        arr[0][0] = 1;
		while(!queue.isEmpty()) {
        	for(int d=0; d<4; d++) {
        		int nr = queue.peek().r+dr[d];
        		int nc = queue.peek().c+dc[d];
        		if(nr>=0 && nr<N && nc>=0 && nc<M && arr[nr][nc]==0) {
        			arr[nr][nc] = arr[queue.peek().r][queue.peek().c]+1;
        			queue.add(new miro(nr, nc));
        		}
        	}
        	queue.poll();
        }
		
		System.out.println(arr[N-1][M-1]);
    }
}

 

[소감]

  • bfs의 다양한 문제를 풀어보는 단계
  • 상당히 흥미롭고 재밌음

 

출처 : 백준 https://www.acmicpc.net/problem/2178

728x90
반응형