/////
Search

백트래킹

기본적인 아이디어

해를 찾는 도중 해가 아니어서 막히면, 되돌아 가서 다시 해를 찾아가는 기법
DFS(깊이 우선 탐색) → 모든 가능한 경로를 탐색한다.
DFS 등으로 모든 경우의 수를 탐색하는 과정에서 조건문 등을 걸어, 답이 절대로 될 수 없는 상황을 정의하고, 그러한 상황일 경우에는 탐색을 중지시킨 뒤, 그 이전으로 돌아가서 다시 다른 경우를 탐색한다.

기본적인 형식

1. 기본적으로 재귀를 사용한다. 2. 재귀 상에서 항상 접근가능한 어떤 공간을 형성해놓는다. 3. 함수를 호출할 때는 종료 조건이 있으며, 그 다음 단계로 이동하는 코드가 존재한다. 따라서 void back_track(int n, int m, int cnt){ //종료조건 if(cnt == m){ } // 그 다음 조건을 탐색하는 조건 for(int i=1; i<=n; i++){ //cnt -> 지금 접근하고 있는 깊이를 나타냄 if(next_condition == possible){ // 조작 back_track(); // 조작 취소 } else pass; } }
JavaScript
복사

N과 M(1)

백트래킹 대표 예제
이걸 보면서 어떻게 백트래킹을 해야할지 생각해보자

N과 M(2)

N과 M(3)

N과 M(4)

N-Queen

백트래킹 대표 어려운 예제
백트래킹을 할 때, 순환을 어떻게 하면 될지를 생각하게 해주는 문제
백트래킹할 때 중요한 것
1.
어떤 걸 기준으로 순환을 할 거냐
2.
순환을 하면서 가능한 경우가 있는지를 어떻게 체크할거냐
3.
체크했을 때, 그 전 상태로 어떻게 되돌아 올거냐
4.
시간 제한을 잘 보자

Sudoku

N-Queen과 마찬가지
백트래킹할 때 중요한 것
1.
어떤 걸 기준으로 순환할거냐
2.
어떤 값을 놓아볼거냐
3.
가능한 경우인지 아닌지를 어떻게 체크하냐
4.
그 전 상태로 어떻게 되돌아 올거냐

연산자 끼워넣기

스타트와 링크