본문 바로가기

알고리즘 이론

백트래킹

728x90
반응형

10개(n)의 숫자가 있을 때{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 이 중 4개(m)를 중복 없이 뽑아 나열하는 경우

{1, 2, 3, 4}, {1, 2, 3, 5}, {1, 2, 3, 6}  ...  {7, 8, 9, 10}와 같이 뽑아 나열할 수 있다.

총 4개의 숫자 중 첫번째 자리(depth=0) 숫자를 고르면 {1, ○, ○, ○}와 같이 나열할 수 있고, 

두 번째 자리(depth=1)를 뽑아 {1, 2, ○, ○} 순서대로 경우의 수를 만들어 나갈 수 있다.

이렇게 각 깊이에 해당하는 케이스를 뽑아 모든 경우의 수를 고르는 방법을 백트래킹이라 한다.

 

예시 코드

public class Test {
	static int n = 10;		//총 10개의 숫자
	static int m = 4;		//중에 4개를 뽑는 경우
	static int[] arr = new int[4];		//4개의 숫자가 들어갈 배열
	static boolean[] used = new boolean[10];		//사용된 숫자를 판단
	
	public static void main(String[] args) {
		backTracking(0, 0);
	}
	public static void backTracking(int num, int depth) {
		if(depth==m) {		//순번 끝에 도달하면
			System.out.println(Arrays.toString(arr));	//해당 배열 출력 후
			return;		//남은 for문 시행하러 return
		}
		for(int i=num; i<n; i++) {
			if(!used[i]) {		//사용되지 않은 숫자인 경우
				used[i]=true;	//사용으로 바꿔주고
				arr[depth]=i+1;		//순번에 맞는 배열에 입력 후
				backTracking(i+1, depth+1);		//다음 순번 숫자 찾으러 들어감
				used[i]=false;	//사용인 경우 케이스를 구했으니 미사용으로 바꿔주고 for문
			}
		}
	}
}
728x90
반응형

'알고리즘 이론' 카테고리의 다른 글

Memoization  (0) 2023.02.22
2차원배열을 1차원 배열로  (0) 2023.02.22
유클리드 호제법 JAVA  (0) 2023.02.21
병합정렬(Merge sort) JAVA  (0) 2023.02.21
재귀함수  (0) 2023.02.21