0. DFS VS BFS

DFS BFS
깊이 우선 탐색 너비 우선 탐색
최단 경로 탐색 * 처음 찾은 경로 D-B-H가 최단 경로라고 할 지라도 다음에 D-G 가 최단 경로일 수도 있기 때문에 반드시 모든 경로를 다 탐색해야 한다. * 최단 경로가 존재한다면, 어느 한 경로가 무한히 깊어진다 해도 최단 경로를 반드시 찾을 수 있다.

1. DFS

2. 백트래킹

int[] visit = new int[N+1];

**dfs(1); //시작지점**

void dfs(int index){
	//1. 체크인
	**visit[index] = true;**
	//2. 목적지인가?
	if(~~~)
			return;
	//3. 연결된 곳을 순회
	for(int i=1;i<N;i++){
		//4. 갈 수 있는가? (가지치기)
		if(~~~~){
			//5. 간다
			dfs(i);
		}
	}
	//6. 체크아웃
	**visit[index] = false;**
}
int[] visit = new int[N+1];

**dfs(1); //시작지점
visit[1] = true; //미리 지정** 

void dfs(int index){
	//2. 목적지인가?
	if(~~~)
			return;
	//3. 연결된 곳을 순회
	for(int i=1;i<N;i++){
		//4. 갈 수 있는가? (가지치기)
		if(~~~~){
			//5. 간다
			**visit[index] = true;** //1. 체크인
			dfs(i);
			**visit[index] = false;** //6. 체크아웃
		}
	}
}

IMG_E320DA4D77F6-1.jpeg

int[] coin = new int[M+1];
Arrays.fill(coin,3); //3개로 초기화

boolean dfs(int now, int index){
	//2. 목적지인가?
	if(index>=M){
		if(K를 만들었니?) return true;
		else return false;
	}
	//3. 연결된 곳 탐색
		for(int i=1;i<M+1;i++){ //가지고 있는 모든 동전의 종류들을 탐색한다.
			//4. 갈 수 있는가?
			if(coin[i] > 0){ //1개이상이면 갈 수 있음
				//1. 체크인
				coin[i]--;
				//5. 간다
				dfs(now + whatCoin[i], index+1);
				//6. 체크아웃
				coin[i]++;
		}
	}
}

백트래킹을 이용한 조합 구하기

static boolean[] visit = new boolean[N];
static ArrayList<Integer> Active = new ArrayList<>();

//N개 고르기
combination(0,0);

static void combination(int index,int count) {
		if(count>=N) {
			System.out.println(Active); //N개 조합 완성
			return;
		}
		for(int i=**index**;i<N;i++) {
			if(!visit[i]) {
				visit[i] = true;
				Active.add(i);
				**dfs(i+1,count+1);**
				visit[i] = false;
				Active.remove(Active.size()-1);
			}
		}
	}

백트래킹을 이용한 순열 구하기

static int[] Order = new int[10+1]; //말 순서 1~10

permutation(1);
combination(1,1);

static void permutation(int count){
  if(count>=4){
      System.out.println(Arrays.toString(Order));
      return;
  }
  for(int i=1;i<5;i++){ //말 1~4
      Order[count] = i; //말i가 Order 순서에 들어감
      permutation(count+1);
  }
}

static void combination(int index, int count){
  if(count>=4){
      System.out.println(OrderArr);
      return;
  }
  for(int i=index;i<5;i++){
      OrderArr.add(i);
      combination(i+1,count+1);
      OrderArr.remove(OrderArr.size()-1);
  }
}

[1, 2, 3]
[1, 2, 4]
[1, 3, 4]
[2, 3, 4]

3. 자식 트리 갯수