본문 바로가기

Algorithm/Inflearn

[Inflearn] 자바 알고리즘 문제풀이 #08-10 10. 미로탐색(DFS)

문제

설명

7*7 격자판 미로를 탈출하는 경로의 가지수를 출력하는 프로그램을 작성하세요.

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

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

위의 지도에서 출발점에서 도착점까지 갈 수 있는 방법의 수는 8가지이다.

 

입력 

7*7 격자판의 정보가 주어집니다.

 

출력 

첫 번째 줄에 경로의 가지수를 출력한다.

 

예시 입력 1 

0 0 0 0 0 0 0
0 1 1 1 1 1 0
0 0 0 1 0 0 0
1 1 0 1 0 1 1
1 1 0 0 0 0 1
1 1 0 1 1 0 0
1 0 0 0 0 0 0

예시 출력 1

8
 
 
 
 
 
내 풀이 = 선생님 풀이
import java.util.Scanner;

public class Main8_10 {
    static int[] dx = {-1, 0, 1, 0};
    static int[] dy = {0, 1, 0, -1};
    static int[][] board;
    static int answer=0;
    public void DFS(int x, int y){
        if(x==7 && y==7) answer++;
        else {
            for (int i = 0; i <= 3; i++) {
                int nx = x+dx[i];
                int ny = y+dy[i];

                if(nx >= 1 && nx <= 7 && ny >= 1 && ny <= 7 && board[nx][ny] == 0) {
                    board[nx][ny] = 1;
                    DFS(nx, ny);
                    board[nx][ny] = 0;
                }
            }
        }
    }

    public static void main(String[] args) {
        Main8_10 T = new Main8_10();
        Scanner sc = new Scanner(System.in);
        board = new int[8][8];
        for (int i = 1; i <= 7; i++) {
            for (int j = 1; j <= 7; j++) {
                board[i][j] = sc.nextInt();
            }
        }
        board[1][1] = 1;
        T.DFS(1, 1);
        System.out.println(answer);
    }
}

선생님 코드를 보고 변수, 배열 이름만 맞춘 채 시작했다.

인프런의 다른 강의(영리한 프로그래밍을 위한 알고리즘 강좌)에서 순환(recursion)에 대해 배웠었고,

그때 해봤던 여러 예제들 중 미로찾기 예제가 있어서 조금 수월하게 풀 수 있었다. (했던 걸 기억하고 풀었을 때 오는 배움의 기쁨,,,✨)

 

https://rookie-programmer.tistory.com/40

 

[Inflearn] 영리한 프로그래밍을 위한 알고리즘 - 순환 (Recursion) 의 응용 : 미로찾기

미로 찾기 그리드의 크기 : N x N (N-1, N-1) 현재 위치에서 출구까지 가는 경로가 있으려면 1) 현재 위치가 출구이거나 2) 이웃한 셀들 중 하나에서 현재 위치를 다시 지나지 않고 출구까지 가는 경로

rookie-programmer.tistory.com

 

 

 

결과