백트래킹 개념
1. 여러 가지 선택지 (옵션) 들이 존재하는 상황에서 한 가지를 선택한다
2. 선택이 이루어지면 새로운 선택지들의 집합이 생성된다
3. 이런 선택을 반복하면서 최종 상태에 도달한다
4. 올바른 선택을 계속하면 목표 상태(goal state)에 도달한다
백트래킹과 깊이우선탐색(DFS)의 차이
DFS는 완전탐색의 방법 중 한 가지이다. 백트래킹은 어떤 노드에서 출발하는 경로가 해결책으로 이어질 것 같지 않으면 더 이상 그 경로를 따라가지 않음으로써 시도의 횟수를 줄인다. (Prunning 가지치기) 깊이 우선 탐색이 모든 경로를 추적하는데 비해, 백트래킹은 불필요한 경로를 조기에 차단한다. 깊이 우선 탐색을 하기에는 경우에 수가 너무나 많다. 즉 N! 가지의 경우의 수를 가진 문제에 대해 깊이 우선 탐색을 가하면 당연히 처리 불가능한 문제이다.
백트래킹 알고리즘을 적용하면 일반적으로 경우의 수가 줄어들지만 이 역시 최악의 경우에는 여전히 지수함수 시간 (Exponential Time) 을 요하므로 처리 불가능하다.
백트래킹 예시 문제로 N-Queen 문제가 있다.
9663 N-Queen (Java)
9663 N-Queen 문제 🌐 N-Queen 문제는 크기가 N×N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에
letusgrow.tistory.com
백트래킹 기법
어떤 노드의 유망성을 점검한 후에 유망(promising)하지 않다고 결정되면 그 노드의 부모로 되돌아가 (backtracking) 다음 자식 노드로 간다. 어떤 노드를 방문하였을 때 그 노드를 포함한 경로가 해답이 될 수 없으면 그 노드는 유망하지 않다고 하며, 반대로 해답의 가능성이 있으면 유망하다고 한다.
가지치기(prunning): 유망하지 않는 노드가 포함되는 경로는 더 이상 고려하지 않는다.
백트래킹 알고리즘
1. 상태 공간 트리의 깊이 우선 검색을 실시한다.
2. 각 노드가 유망한지를 점검한다.
3. 만일 그 노드가 유망하지 않으면, 그 노드의 부모 노드로 돌아가서 검색을 계속한다.
checknode (node v)
if promising(v)
if there is a solution at v
wrtie the solution
else
for each child u of v
checknode(u)
상태 공간 트리를 구축하여 문제 해결
bool backtrack(선택 집합, 선택한 수 cnt, 모든 선택수 n) // n개에서 r개를 고를 때
{
if (선택한 수 == 모든 선택수) // 더 이상 탐색할 노드가 없다
{
찾는 솔루션인지 체크;
return 결과;
}
현재 선택한 상태집합에 포함되지 않는 후보 선택들 (노드) 생성
모든 후보 선택들에 대해
{
선택 집합에 하나의 후보 선택을 추가
선택한 수 += 1
결과 = backtrack 호출 (선택집합, 선택한 수, 모든 선택수)
if (결과 == 성공)
return 성공; // 성공한 경우 상위로 전달
}
return 실패;
}
백트래킹을 사용해서 순열을 구할 수 있다. 마음의 숙제처럼 못 하고 있다가 이제서야 겨우 할 줄 알게 되었는데... 다음 글에서 살펴boza!!
'알고리즘' 카테고리의 다른 글
이중 탐색 Binary Search, 퀵 정렬 Quick Sort (0) | 2023.09.29 |
---|---|
분할 검색 - 개념과 병합 정렬 (0) | 2023.09.28 |
비트마스킹 - 부분집합, 조합 (0) | 2023.09.27 |
자료구조 트리 Tree - 정의, 이진 트리 (0) | 2023.09.25 |
자료구조 연결 스택, 연결 큐 (0) | 2023.09.24 |