인프런 커뮤니티 질문&답변

toran8754님의 프로필 이미지
toran8754

작성한 질문수

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

dfs 미로탐색 질문입니다

작성

·

143

0

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);
	}
}

위 코드에서  board[nx][ny]=0; 부분이 이해가 안됩니다

강의에서는 빽할때 0으로 만들어준다고 하셨고요

다른 비슷한 강의에서는 대칭하기위에 만들어주신다고 하셨씁니다 

sysout으로 일일이 찍어보니까 

0으로 만들어주는 타이밍이 그때그때 다르더라구요.

7행 7열까지 가고난 이후 첫번째로 0을 대입해주던데요  아무리 재귀함수더라도 

재귀함수마다 결과적으로는 board[nx][ny] =0을 거쳐야하는데 그렇지가 않습니다

한 3 4일쨰 이것만 검색하면서 하고 있는데 답답하기만 하고 이해가 안됩니다 

뭔가 흐름이 이상합니다  그냥 이부분도 암기인가요? ㅠㅠ  

답변 1

0

김태원님의 프로필 이미지
김태원
지식공유자

안녕하세요^^

재귀함수가 스택을 사용해서 뒤로 back track 하는 방식이 아직 정확하게 와닿지 않아서 생기는 것입니다.

섹션 8의 재귀함수 문제들을 스택과 트리를 그려가면서 연구해보고 스스로 여러번 풀어보세요. 

DFS 백트랙킹에 대한 이해하는데 시간이 필요합니다. 이 강좌다 보시면 다시 이 강좌 섹션 8과 섹션 9를 스스로 여러번 풀어보세요.  문제들을 풀어보면 깨달음이 올겁니다.

toran8754님의 프로필 이미지
toran8754

작성한 질문수

질문하기