1. 백트래킹이란?
모든 가능한 경우의 수를 탐색하되, **"유망하지 않은 경로"**를 미리 차단(Pruning, 가지치기)하여 효율적으로 해를 찾는 알고리즘입니다. 주로 **재귀(Recursion)**를 통해 구현하며, '가다가 막히면 되돌아온다'는 것이 핵심입니다.
2. 핵심 문제로 본 백트래킹의 진화
우리가 함께 푼 5가지 대표 문제를 통해 백트래킹의 발전 단계를 정리했습니다.
| 문제 유형 | 핵심 개념 | 주요 테크닉 |
| N과 M 시리즈 | 순열과 조합 | visited 배열, start 인자 사용 |
| N-Queen | 2차원 공간 제약 | 대각선 인덱스 공식 (r+c, r-c+n) |
| 스도쿠 | 3중 제약 조건 | 상태 체크 배열 (행, 열, 3x3 박스) |
| 연산자 끼워넣기 | 자원(개수) 관리 | 연산자 잔여 개수 기반 분기, 음수 나눗셈 처리 |
| 스타트와 링크 | 팀 나누기(조합) | 대칭성 제거 (0번 항목 고정), 시너지 합산 |
3. 백트래킹의 3대 필수 요소 (Code Template)
모든 백트래킹 코드는 아래와 같은 공통 구조를 가집니다.
Python
def backtracking(depth):
# 1. 기저 조건 (종료 조건)
if depth == 목표치:
결과 처리 및 출력
return
# 2. 하위 선택지 탐색
for i in range(전체_범위):
if 유망한가(i): # 가지치기 (Pruning)
# 3. 상태 변화 (전진)
visited[i] = True
기록.append(i)
backtracking(depth + 1) # 재귀 호출
# 4. 상태 복구 (후퇴 - 가장 중요!)
visited[i] = False
기록.pop()
4. 성능 최적화의 비결 (Python vs C)
우리가 실습하며 배운 언어별 최적화 포인트입니다.
- Python (공간을 써서 시간을 산다)
- itertools.combinations 등을 활용한 표준 라이브러리 최적화.
- sys.exit(0)를 활용한 조기 종료.
- 매번 루프를 돌며 체크하지 않고 **체크용 배열(Set/List)**을 미리 만들어 O(1)로 유망성 검사.
- C언어 (메모리 직관과 포인터)
- Call by Reference: 결과값(min, max)을 주소로 넘겨 모든 재귀가 공유하게 함.
- 전역 변수 활용: 함수 호출 시 스택 메모리 사용량을 줄여 성능 극대화.
- 나눗셈 특성: C의 / 연산자는 0을 향해 절삭하므로 별도의 처리가 필요 없음.
5. 학습하며 얻은 깨달음
- 초기값 설정: 최댓값을 찾을 땐 가능한 가장 작은 값으로, 최솟값은 가장 큰 값으로 시작해야 경계선 오류가 없습니다.
- 원상복구의 중요성: 재귀에서 돌아온 뒤 상태를 다시 0이나 False로 돌려놓지 않으면, 다른 우주(경로)가 오염됩니다.
- 인덱스 맞추기: 배열 크기를 N+1이나 10으로 잡아 실제 숫자와 인덱스를 일치시키면 버그를 획기적으로 줄일 수 있습니다.
'코딩테스트 > 백준' 카테고리의 다른 글
| [C/Python] 재귀 (0) | 2026.03.21 |
|---|---|
| [C/Python] 심화 2 (0) | 2026.03.19 |
| [C/Python] 조합론 (0) | 2026.03.18 |
| [C/Python] 스택, 큐, 덱 1 (0) | 2026.03.18 |
| [C/Python] 약수, 배수와 소수 2 (0) | 2026.03.16 |