DFS, BFS 기출문제 풀이

미로의 최단거리 통로(BFS)

  • 설명 : 7*7 격자판 미로를 탈출하는 최단경로의 길이를 출력하는 프로그램을 작성하세요.

경로의 길이는 출발점에서 도착점까지 가는데 이동한 횟수를 의미한다.

출발점은 격자의 (1, 1) 좌표이고, 탈출 도착점은 (7, 7)좌표이다. 격자판의 1은 벽이고, 0은 도로이다.

격자판의 움직임은 상하좌우로만 움직인다. 미로가 다음과 같다면

Image1.jpg

위와 같은 경로가 최단 경로의 길이는 12이다.

  • 입력 : 첫 번째 줄부터 7*7 격자의 정보가 주어집니다.

  • 출력 : 첫 번째 줄에 최단으로 움직인 칸의 수를 출력한다. 도착할 수 없으면 -1를 출력한다.

  • 풀이

import java.util.*;

public class Main {

    static int[][] map = new int[8][8], chk = new int[8][8], dis = new int[8][8];
    static int[][] cr = \{\{1,0}, {-1,0}, {0,1}, {0,-1}\}\;

    public int solution(int x, int y){
        Queue<int[]> queue = new LinkedList();
        queue.add(new int[]{x, y});
        chk[x][y] = 1;
        dis[x][y] = 0;

        while(!queue.isEmpty()){
            int[] crr = queue.poll();
            int c_x = crr[0];
            int c_y = crr[1];
            if(c_x==7 && c_y==7) return dis[7][7];
            for (int[] ints : cr) {
                int t_x = c_x+ints[0];
                int t_y = c_y+ints[1];
                if(t_x>=0 && t_x<=7 && t_y>=0 && t_y<=7 && chk[t_x][t_y]==0 && map[t_x][t_y]!=1 ){
                    dis[t_x][t_y]=dis[c_x][c_y]+1;
                    chk[t_x][t_y]=1;
                    queue.add(new int[]{t_x,t_y});
                }
            }
        }
        return -1;
    }

    public static void main(String[] args) {
        Main t = new Main();
        Scanner scan = new Scanner(System.in);
        for(int i=1; i<8; i++){
            for(int j=1; j<8; j++){
                map[i][j] = scan.nextInt();
            }
        }

        System.out.println(t.solution(1,1));
    }
}
  • 정리
    • 최단거리 찾기의 경우 최대한 방법을 머릿속에 암기해두어야 한다
    • map, chk, dis 세가지의 배열을 만들어 방문체크 및 거리 계산용으로 활용해야하며
    • 최단거리는 BFS로 풀이를 하는것이 정석적임
    • 위와 같은 경우에는 장애물이나 지도의 크기 예외조건을 잘 설정하는 것이 팁이다.

Updated: