출시·고도화 중
Algorithm
백트래킹은 해를 한 단계씩 만들다가 조건을 어기면 되돌아가는 탐색 기법으로, 순열·조합·N-Queens·스도쿠 같은 문제를 가지치기로 빠르게 풉니다.
백트래킹은 답을 한 칸씩 채워 가며 상태 공간 트리를 깊이 우선으로 탐색하고, 지금까지의 선택이 제약 조건을 어기면 바로 앞 단계로 돌아가 다른 선택을 시도하는 기법입니다. 코드는 후보를 고르고(선택), 재귀로 내려가고(탐색), 돌아와서 고른 것을 되돌리는(되돌리기) 세 동작의 반복으로 이루어집니다.
모든 후보를 끝까지 만든 뒤 검사하는 완전 탐색과 달리, 백트래킹은 가망 없는 가지를 중간에 잘라 내므로 같은 문제를 몇 자릿수 적은 시도로 풉니다. 순열과 조합 나열, N-Queens, 스도쿠, 그래프 색칠 같은 제약 충족 문제의 기본 풀이이며, 정규 표현식 엔진과 SAT 솔버의 바탕이기도 해서 코딩 테스트와 실무 모두에서 자주 만납니다.
부분집합과 순열처럼 가지치기가 없는 나열 문제로 선택·탐색·되돌리기의 틀을 먼저 익히고, N-Queens와 스도쿠로 제약 검사와 가지치기를 연습하는 순서가 좋습니다. 그다음 방문 노드 수를 직접 세어 가지치기의 효과를 확인하고, 같은 문제를 동적 계획법과 비교해 언제 어떤 기법을 고를지 정리해 두세요.
빈 상태를 루트로, 선택 하나를 간선으로 보면 모든 후보가 트리의 경로가 되고 백트래킹은 이 트리를 깊이 우선으로 탐색합니다.
부분해에 후보를 넣고 재귀로 내려간 뒤 돌아와서 빼는 패턴으로, 하나의 리스트를 모든 가지가 함께 씁니다.
현재 부분해가 해로 이어질 수 없으면 그 아래 가지 전체를 건너뛰어, 지수 크기의 탐색 공간을 실제로는 훨씬 작게 만듭니다.
열·대각선·행·상자처럼 이미 쓴 값을 집합이나 배열로 관리하면 새 선택이 규칙을 어기는지 상수 시간에 판정할 수 있습니다.
permutations는 used 배열로 이미 고른 원소를 막으며 선택·탐색·되돌리기로 모든 순열을 만들고, 완성된 경로는 path[:]로 복사해 저장합니다. n_queens는 열과 두 대각선(row - c, row + c)을 집합으로 관리해 공격받는 칸을 바로 건너뛰고 해의 개수를 셉니다. python backtracking.py로 실행하면 [1, 2, 3]의 순열 6개와 8-Queens의 해 92가 출력됩니다.
backtracking.py
def permutations(items):
result, path = [], []
used = [False] * len(items)
def backtrack():
if len(path) == len(items):
result.append(path[:]) # store a copy of the full path
return
for i, x in enumerate(items):
if used[i]:
continue
used[i] = True # choose
path.append(x)
backtrack() # explore
path.pop() # unchoose
used[i] = False
backtrack()
return result
def n_queens(n):
cols, diag, anti = set(), set(), set()
def place(row):
if row == n:
return 1
count = 0
for c in range(n):
if c in cols or row - c in diag or row + c in anti:
continue # prune: square is attacked
cols.add(c); diag.add(row - c); anti.add(row + c)
count += place(row + 1)
cols.remove(c); diag.remove(row - c); anti.remove(row + c)
return count
return place(0)
print(permutations([1, 2, 3]))
print(n_queens(8)) # 92
python backtracking.py백트래킹 에 관해 묻고, 경험을 나누고, 의견을 주고받는 곳입니다.
아직 토론이 없습니다. 첫 이야기를 시작해 보세요.
댓글 0개
로그인 · 로그인하면 댓글을 남길 수 있습니다.
첫 댓글을 남겨 보세요.