백트랙킹은 알고리즘 기법 중 하나로, 재귀적으로 문제를 하나씩 풀어가되, 현재 재귀를 통해 확인중인 노드(상태)가 제한 조건에 위배되는지(유망하지 않은지) 판단하고, 그러한 경우에는 해당 노드(상태)를 제외하고 다음 단계로 나아가는 방식이다.
여기서 중요한 점은 특정 노드(상태)를 제외한다는 것이다!
백트랙킹은 현재 상태(노드)에서 다음 상태(노드)로 나아갈 수 있는 모든 경우를 찾되, 그 중 유망하지 않다면 현재에서 더 이상 나아가지 않고 이전의 상태(노드)로 돌아가 다음 상태(노드)를 검사한다.
백트랙킹을 사용하는 알고리즘 중 하나는 대표적으로 DFS가 있다. DFS는 재귀를 통해 가능한 경로 중 유망한 경로만 찾아서 탐색한 뒤 다시 돌아와 그 중 가장 최적의 경로를 반환한다.
백트랙킹을 사용해 해결할 수 있는 문제는 의사 결정, 최적화, 열거하기 등이 있다.
사실 백트랙킹은 사용 가능한 경우가 많지만 시간 복잡도가 보통 Exponential(지수, 2^n 꼴)이며, 대부분 Dynamic Programming, 그리디 알고리즘 등으로 더 빠르게 해결할 수 있다.
하지만 일부 문제들은 여전히 백트랙킹으로만 해결이 가능한 문제도 있다..!
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다.
N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
첫째 줄에 N이 주어진다. (1 ≤ N < 15)
첫째 줄에 퀸 N개를 서로 공격할 수 없게 놓는 경우의 수를 출력한다.
첫번째 행에 퀸을 놓는다.
두번째 줄에 되는 칸이 있으면, 세번째 줄로 내려간다.
세번째 줄에 되는 칸이 없으면, 다시 두번째 줄로 올라간다.
- 백트래킹은 재귀함수를 사용한다.
- 함수를 이용하자!

위 사진에서는 3번째 열에서 어떠한 곳에서든 퀸을 배치할 수 없다! 그러니 백트랙킹으로 2번째 열로 돌아가 다시 다른 행에 배치한다.
코드1
import sys
n = int(sys.stdin.readline())
arr=[0 for _ in range(n)]
sum=0
def check(r1, c1, r2, c2):
if c1==c2:
return True # 같은 열
if r1-c1=r2-c2:
return True # (1)번 대각선
if r1+c1=r2+c2:
return True # (2)번 대각선
return False
def dfs(row):
if row==n:
global sum
sum+=1
else:
for cand in range(n): # row행에 퀸이 놓일 열을 순차적으로 탐색
possible=True
for i in range(row): # row이전 행들에 놓인 퀸에 대해서 열, 대각선 체크
if check(row, cand, i, arr[i]):
possible=False
break
if possible:
arr[row]=cand
dfs(row+1)
arr[row]=0
dfs(0)
print(sum)
코드2
import sys
n = int(sys.stdin.readline())
arr = [0 for _ in range(n)]
sum = 0
def check(row):
for i in range(row):
if arr[row]==arr[i] or abs(arr[row]-arr[i])==abs(row-i): # 같은 열, 대각선 (1), 대각선 (2) 이면,
return False
return True
def dfs(row):
if row == n:
global sum
sum+=1
else:
for cand in range(n): # row행에 퀸이 놓일 열을 순차적으로 탐색
arr[row]=cand #행 값 고정
if check(row):
dfs(row+1)
코드1,2 모두 python3으로 제출하면 시간초과 발생,,
pypy3로 제출해야 함.
The knight's tour problem (https://www.geeksforgeeks.org/the-knights-tour-problem/)
Rat in a Maze (https://www.geeksforgeeks.org/rat-in-a-maze/)
Subset Sum(https://www.geeksforgeeks.org/subset-sum-problem/)
m Coloring Problem(https://www.geeksforgeeks.org/m-coloring-problem/)
즉, DFS와 백트랙킹은 유사한 부분이 있으며
기본적으로 사용 목적이 다르지만 두 기법을 혼용하여 사용하는 것이 가능하다!
완전히 다른 개념이 아니라 재귀 호출을 통한 기법 중 하나이기 때문이다.
https://sso-feeling.tistory.com/415
https://hongjw1938.tistory.com/88