오늘의 주제
- 상태 공간 트리
- 백트래킹
- 가지치기 전략
- 활용 예제
상태 공간 트리는 문제 해결 과정에서 나올 수 있는 모든 상태를 트리 구조로 표현한 개념이다.
상태 공간 트리는 실제로 메모리에 만드는 자료구조가 아니라
탐색 과정을 이해하기 위해 사용하는 개념적 모델
트리의 깊이는 보통 문제의 단계 수와 대응되며,
자식 노드는 다음 단계에서 가능한 선택지를 의미한다.
이때 리프 노드는 하나의 완성된 해이거나, 더 이상 진행할 수 없는 실패 상태가 된다.
백트래킹 알고리즘은 모든 가능한 해를 탐색하는 완전 탐색 기반 알고리즘이다.
초기 상태에서 시작하여 가능한 선택을 하나씩 시도하고, 조건을 만족하는 해를 발견하면 이를 기록한다.
모든 선택을 시도하거나 더 이상 유효한 해가 될 수 없는 경우에는 이전 상태로 되돌아가 (=> 백트래킹!) 다른 선택을 탐색한다.
백트래킹은 일반적으로 DFS(깊이 우선 탐색) 방식으로 상태 공간을 탐색한다.
트리의 전위·중위·후위 순회 역시 DFS의 한 형태이며, 이를 기반으로 백트래킹 과정을 설명할 수 있다.

백트래킹의 핵심은 Attempt(시도) 와 Backtrack(되돌리기) 이다.
이 두 과정은 항상 쌍으로 동작하며,
코드에서는 보통 상태 추가 → 재귀 호출 → 상태 제거 형태로 나타난다.
백트래킹 문제에는 보통 제약 조건(constraint) 이 포함되며, 이 제약 조건을 이용해 Pruning(가지치기) 을 수행할 수 있다.
탐색 중 조건을 위반하는 상태를 만나면 해당 상태 아래의 모든 탐색을 즉시 중단하는데, 이를 통해 불필요한 탐색 경로를 제거하고 시간과 공간 효율을 크게 개선할 수 있다.

결과적으로 백트래킹은 상태 공간 트리 전체를 탐색하는 것이 아니라,
가지치기를 통해 유망한 경로만 선택적으로 탐색하게 된다.
def backtrack(state, choices, res):
# 1. 해 검사
if is_solution(state):
res.append(state.copy())
return
# 2. 선택지 탐색
for choice in choices:
# 3. 가지치기 (pruning)
if not is_valid(state, choice):
continue
# 4. Attempt
state.append(choice)
# 5. 다음 상태 탐색
backtrack(state, next_choices(choice), res)
# 6. Backtrack
state.pop()
백트래킹의 가장 기초적인 문제
15649를 풀었다면 N과 M (12)까지 날먹이 된다
백트래킹 알고리즘에서 가장 유명한 N-queen 문제
시간복잡도 조건 맞추는게 빡세다

ㅋㅋ