내일배움캠프 61일차 - 자료구조 & 알고리즘 11주차 : 백트래킹
백트래킹 - "완전 탐색 + 가지치기"
완전 탐색을 하되, "답이 될 수 없는 방향"을 조기에 포기하고 되돌아가는 기법
완전 탐색: 재귀 트리의 모든 잎(leaf)까지 내려간다. - 무조건 끝까지.
백트래킹: 트리의 중간에서 "이 아래는 볼 필요 없다"고 판단하면 가지를 잘라낸다.
| × = "답이 될 수 없다" → 이 아래 전체를 건너뛴다는 의미 |
백트래킹의 핵심 두 요소
1) 유망성 판단 (Promising)
:"현재 상태에서 더 진행해도 답이 될 가능성이 있는가?"
- 제약 조건을 검사하는 단계
2) 가지치기 (Pruning)
:유망하지 않으면 그 가지 전체를 건너뜀
- 아래로 더 내려가지 않는다.
부분합 문제 - 같은 문제, 더 똑똑하게.
문제: 배열 {3,7,1,8,4}에서 합이 11인 부분집합을 찾아라.
완전 탐색 방법: 부분집합 2^5 = 32개를 모두 만든 뒤 각각의 합을 확인 → 11인 것 찾기
백트래킹: 부분집합을 만드는 도중에 "이미 합이 11 초과"라면 → 가지치기
부분합 추적
| 회색: 탐색한 루트 / 녹색: 정답 루트 / 주황색: 오답 루트 / 희미한 색: 탐색하지 않은 루트 |
배열 {3,7,1,8,4}의 부분집합은 사진의 모든 구슬의 개수와 같다.
( 완전탐색 시 탐색횟수 2^5 = 32회)
( 위 사진에서 백트래킹으로 탐색한 횟수 14 + 8 + 3 = 25회 )
정렬이 가지치기를 효율적으로 만든다
원본: 37184
정렬 후: 13478
( 정렬된 백트래킹으로 탐색한 횟수 13 + 6 +3 = 22회(-3) )
N-Queen 문제
문제: N × X 체스판에 N개의 퀸을 서로 공격하지 못하게 배치하라.
8-Queen 완전 탐색 시: 64칸 중 8칸 선택 = C(64,8) = 약 44억번 → 불가능
※ 한 행에 퀸 하나씩만 배치하면 해도 8^8 = 1677만번
4-Queen 백트래킹 과정
4-Queen 완전 탐색 시: 16칸 중 4칸 선택 = C(16,4) = 1820번
※ 한 행에 퀸 하나씩만 배치하면 4^4 = 256번
4-Queen 백트래킹으로 탐색한 횟수: 15 + 44(X개수) + 2 ≒ 60
N-Queen 가지치기 효과
백트래킹의 최선의 경우: 가지치기가 잘 통하는 문제 → 완전 탐색 대비 99% 이상 절감.
최악의 경우: 가지치기 조건이 안 걸림 → 완전 탐색과 비슷한 시간
백트래킹의 3단계 패턴
CS 돋보기
CSP(Constraint Satisfaction Problem, 제약 충족 문제)
말 그대로 '조건을 만족하는 답을 찾는 문제' 를 나타낸다.
변수(Variables): 결정해야 할 것들
도메인(Domain): 각 변수가 가질 수 있는 값들
제약(Constraints): 변수들 간의 조건
게임 AI(알파-베타 가지치기)
체스·바둑 AI의 기초인 Minimax 알고리즘
: "나는 최선의 수, 상대는 최악의 수"를 재귀적으로 탐색
※ 딥블루(1997 체스), 알파고(2016 바둑)도 근본적으로는 트리 탐색 + 가지치기의 확장이다.
실전에서는?
게임 개발
- 체스·바둑·오목 AI: 백트래킹 + 알파-베타 가지치기로 가능성의 폭발을 통제
- 턴 기반 AI: "내수 → 상대 수 → 내 수" 트리 탐색에서 불리한 가지 잘라내기
- 퍼즐 생성기: 스도쿠·지뢰찾기의 유효한 퍼즐 자동 생성 - 무효하면 되돌아감
- 레벨 생성: "이 방에 적 N마리, 막다른 길 없음" 같은 제약을 만족하는 맵 배치
웹,서버
- 시간표 자동 생성: 교수·강의실·연속 수업 제한 등 수백 개 제약 만족
- 회의실 / 직원 근무 스케줄: 가능한 배치 중 제약을 깨지 않는 것만 채택
- 물류 / 배차 계획: 시간·차량·경로 제약을 동시에 만족
- 웹 라우팅 매칭: 패턴 매칭 단계에서 백트래킹 사용
일반 CS
- SAT(논리식 충족): 변수 값 배정 + 절 제약 → DPLL 알고리즘(백트래킹 + 가지치기)
- 그래픽 색칠 문제: 인접 노드는 다른 색 - 한 노드씩 색칠하다 막히면 되돌아감
- 컴파일러: 정규식 매칭 / 피서의 일부 모드
- 패스워드 크래킹: 보안 분야에서 무차별 대입의 가지치기 변형
※ 이론적으로 어려운 문제(NP)도 가지치기로 인해 실전에서 풀 수 있는 크기가 된다.
오늘의 핵심
- 백트래킹 = 완전 탐색 + 가지치기: 모든 경우를 요약하되, "답이 될 수 없는 방향"은 조기에 포기.
- 유망성 판단(Promising)이 핵심: "현재 상태에서 더 진행해도 답이 가능한가?"
- 패턴: 선택 → 검증 →재귀 →되돌림. 10주차 순열/조합 코드에 검증 한 줄을 추가하면 백트래킹.
- 가지치기 효과는 극적: N-Queen에서 N=8이면 99.9% 절감
- 단, 보장은 없다: 최악의 경우 완전 탐색과 동일. "가지치기가 통하는 문제"에서 위력 발휘.
댓글
댓글 쓰기