티스토리 뷰
1. 개요
[그림 1] 백 트래킹(Backtracking) 과정
백트래킹의 주요 개념은 해를 얻을 때까지 모든 가능성을 시도하는 기법이다. 모든 가능성은 하나의 트리처럼 구성할 수 있으며, 가지 중에서 해결책을 찾는다. 탐색 중에 오답을 만나면 이전 분기점으로 돌아가고 시도해보지 않은 다른 해결 방법이 있으면 시도한다. 여러 시도중 해결 방법이 더이상 없으면 더 이전의 분기점으로 돌아가고 모든 트리의 노드를 검사해도 답을 찾지 못할 경우, 이 문제의 해결책은 없는 것으로 간주한다.
1. 어떤 노드의 유망성을 점검한 후에 유망(Promising)하지 않다고 결정되면 그 노드의 부모로 돌아가 (backtracking) 다음 자식 노드로 감
2. 어떤 노드를 방문하였을 때 그 노드를 포함한 경로가 해답이 될 수 없다면 그 노드는 유망하지 않다고 하며, 반대로 해답의 가능성이 있으면 유망하다고 한다.
3. 가지치기 (pruning) : 유망하지 않는 노드가 포함되는 경로는 더 이상 고려하지 않는다.
2. 백트래킹 예제 1 - 보글게임
[그림 2] 보글게임
N X M 크기의 알파벳 격자에서 상하좌우 / 대각선 으로 인접한 칸들의 글자들을 이어서 단어를 찾아내는 게임
※ 입력 : 정수 N,M은 1<= N <= 100, 1<= M <= 1000의 크기를 갖는다.
1. main()
2. 판 초기화 및 게임구동 함수
3. 백트래킹 예제 2 - N Queen
[그림 3] N Queen 문제
N * N 체스 보드판에 N개의 queen을 서로 공격하지 못하도록 배치하는 방법을 찾아내는 문제.
입력 : 정수 n을 입력한다 ( 1<=N<=15 )
출력 : 서로 총 경우의 수를 출력한다.
[해결법]
이 문제를 풀기위해선 퀸의 공격범위에 대해 생각을 해야한다.
퀸이 공격할수 있는 루트는 상하좌우/대각선 이동이 가능하고 판의 끝까지 갈 수 있다. 따라서 생각해보면 한 행에 하나 이상의 퀸을 놓을 수 없다는 성질, 예를들어 4*4 의 체스판에서 화살표가 지나간 칸에는 퀸을 놓을 수 없다는 성질을 고려한다.
[그림 4] 4*4판에서의 퀸의 공격방향
1. 첫 번째 행, 첫 번째 열에 퀸을 놓는다.
2. 다음 행에서 가능한 가장 왼쪽 열에 퀸을 놓는다.
3. N번째 열에 더 이상 퀸을 놓을 수 없다면 백트랙 한다.
4. 마지막 행에 퀸을 놓으면 하나의 해를 구한 것이다.
5. 모든 경우를 조사할 때까지 백트래킹하며 해를 구함.
행은 검사할 필요가 없으므로, 열과 대각선만 검사하면 된다. 열을 검사하는 방법은 크기가 N 인 체크 배열을 만들어 K번째 열에 퀸을 놓았다면 배열의 K번째 위치를 체크하여 이후의 행에서는 체크된 열에 퀸을 놓지않게 한다.
열과 마찬가지로 대각선도 체크배열을 통해 판별한다.
'프로그래밍 > 알고리즘' 카테고리의 다른 글
깊이 우선 탐색 (DFS) (0) | 2016.08.26 |
---|---|
탐욕법 ( Greedy ) (0) | 2016.08.26 |
분할 정복 ( Divide and conquer Algorithm ) (1) | 2016.08.24 |
재귀 호출 ( Recursive call ) (0) | 2016.08.24 |
다익스트라 알고리즘 ( Djikstra Algorithm ) (0) | 2016.08.23 |