백트래킹이란?

백트래킹 과정

  1. 현재 상태가 목표 조건을 만족하는지 확인

  2. 현재 상태가 유효한 상태인지 확인

  3. 다음 상태로 진행

  1. 탐색이 끝나면 이전 상태로 되돌아감 (Backtracking)

예제: 조합을 이용한 백트래킹 (N개 중 M개 선택)

#include <iostream>
#include <vector>
using namespace std;

int N, M;
vector<int> selected;

void backtrack(int start, int count) {
    if (count == M) {
        for (int num : selected) cout << num << " ";
        cout << '\n';
        return;
    }

    for (int i = start; i <= N; i++) {
        selected.push_back(i);
        backtrack(i + 1, count + 1);
        selected.pop_back(); // 백트래킹 (이전 상태로 되돌리기)
    }
}

int main() {
    cin >> N >> M;
    backtrack(1, 0);
    return 0;
}

알고리즘 설명

백트래킹의 핵심 개념

개념 설명
가지치기 (Pruning) 제한 조건을 위배하는 경우 즉시 탐색 중단
완전 탐색과 차이점 모든 경우의 수를 탐색하지만, 불필요한 경우를 미리 제거
재귀 호출 현재 상태에서 다음 상태로 진행
백트래킹 탐색 후 원래 상태로 되돌아감