코딩테스트

[인프런/DFS/10.미로탐색]

개발하는지호 2024. 4. 1. 20:37

<<풀이>>

 

이 문제는 ch와 DFS 그리고 dx, dy를 잘 적용하면 쉽게 풀 수 있는 문제이다. 

 

우선은 여기서 1,1 점이 시작이라고 했으니깐, 배열 특성상 0,0 부터 생기는 것을 감안해서 가독성을 위해 8,8 로 크기를 맞춰줬다.

 

이렇게 하면 0행 0열 전부 이용은 안하고 1,1부터 시작하게 할 수 있다.

 

그러고 난 뒤에 적절하게 DFS를 만들어주고  7x7 행렬에서 벗어나는 경우는 return 하도록 했다.

 

마지막으로 ch를 둠으로써 이미 지나간 자리는 다시 한 번 돌아가지 못하게 하기위해 ch를 도입했다. 그 지점을 지날 때 ch = 1을 두고 안 지나가면 ch = 0으로 만들어주었다.

 

그 결과 이상없이 문제를 풀 수 있었다 !!

 

전형적인 DFS 문제로서 이제 이런 문제는 손쉽게 풀 수 있다 ㅎㅎ 

import java.util.Scanner;

class Main {
    public static int[] dx = {0, 0, -1, 1};
    public static int[] dy = {-1, 1, 0, 0};
    public static int count = 0;
    public static int[][] ch = new int[8][8];

    private void DFS(int[][] arr, int row, int column) {
        if (row == 7 && column == 7) {
            count++;
            return;
        }

        if (row < 1 || row > 7 || column < 1 || column > 7) {
            return;
        } else if(ch[row][column] != 1 && arr[row][column] == 0){
            ch[row][column] = 1;
            DFS(arr, row + dx[0], column + dy[0]);
            DFS(arr, row + dx[1], column + dy[1]);
            DFS(arr, row + dx[2], column + dy[2]);
            DFS(arr, row + dx[3], column + dy[3]);
            ch[row][column] = 0;
        }
    }



    public static void main(String[] args) throws Exception{
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        int[][] arr = new int[8][8];
        for (int i = 1; i <= 7; i++) {
            for (int j = 1; j <= 7; j++) {
                arr[i][j] = in.nextInt();
            }
        }

        T.DFS(arr, 1, 1);

        System.out.println(count);


    }
}

 

-강사님 풀이-

 

이번에는 강사님과 나의 풀이가 크게 틀리지 않다. 다만, 반복문을 활용해서 조금 더 코드를 깔끔하게 만들었다는 점이다.

for문을 통해 DFS의 수 차이가 나는 것을 볼 수 있다.

그리고 board 역시 static으로 빼줬는데 이렇게도 할 수 있음을 한 번 인지하고 간다 !!

 

외에는 동일하다 ㅎㅎ

 

강사님께 많이 배워서 그런지 풀이 많이 닮아있다 !!

 

오늘도 많이 배워간답

import java.util.*;
class Main {
    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<4; 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){
        Main T = new Main();
        Scanner kb = 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]=kb.nextInt();
            }
        }
        board[1][1]=1;
        T.DFS(1, 1);
        System.out.print(answer);
    }
}