백트래킹(Backtracking)의 개념과 구조적 사고 - soo:bak
작성일 :
백트래킹이란?
백트래킹은 가능한 모든 선택지를 순차적으로 탐색하되, 조건을 만족하지 않는 경우 해당 경로를 조기에 중단하는 탐색 기법입니다.
즉, 조건 판단을 통해 의미 없는 탐색을 피하고 탐색 공간을 효과적으로 줄인다는 특징을 가지고 있으며,
다음과 같은 절차를 기반으로 합니다:
선택 가능한 후보군
을 정의합니다.하나의 선택
을 적용하여 상태를 변화시킵니다.조건을 평가
하여유효할 경우에만 다음 단계로 탐색
을 이어갑니다.- 조건을 만족하지 않는 경우 즉시 탐색을 종료하고
이전 상태로 복원
합니다.
이러한 흐름은 매 선택마다 새로운 경로를 전개하며,
조건을 바탕으로 더 이상 탐색할 필요가 없는 경우에는 해당 경로를 조기에 차단하여 효율적인 탐색을 가능하게 합니다.
모든 경우를 탐색할 수 있는 구조이지만, 조건에 따라 의미 없는 경로를 빠르게 배제함으로써 실질적으로 유의미한 경로만을 집중적으로 탐색하는 것입니다.
이러한 특징으로, 백트래킹은 조합이나 순열처럼 가능한 선택의 수가 많은 문제, 혹은 특정 제약 조건이 주어진 구성 문제에 적합합니다.
백트래킹의 절차적 구조
백트래킹은 가능한 모든 경로를 고려하되 조건
을 바탕으로 의미 없는 경로를 조기에 배제함으로써 탐색의 효율을 높이는 탐색 구조를 가집니다.
이 때, 구조는 다음과 같은 절차들로 구성됩니다:
- 초기 상태에서 출발하여, 선택 가능한 후보들을 순차적으로 살펴봅니다.
- 하나의 선택을 상태에 적용한 뒤, 조건을 검사합니다.
- 조건을 만족하지 않으면 즉시 탐색을 중단하고 상태를 되돌립니다.
- 조건을 만족할 경우에만 다음 단계로 재귀적으로 탐색을 이어갑니다.
- 모든 재귀 호출이 끝난 뒤에는 상태를 복원하여 이후 선택에 영향을 주지 않도록 합니다.
선택 → 검사 → 복원의 흐름
백트래킹은 탐색의 구조를 세밀한 흐름으로 나누고, 이 흐름을 일관되게 반복함으로써 전체 탐색의 정확성을 유지합니다.
이 흐름은 다음과 같은 세 가지 단계로 구성됩니다:
- 선택: 현재 상태에서 가능한 후보 중 하나를 선택하여 상태를 한 단계 진행시킵니다.
- 검사: 선택된 상태가 문제 조건을 만족하는지 평가합니다. 조건에 어긋난 경우에는 즉시 해당 경로의 탐색을 중단합니다.
- 복원: 탐색을 마치고 돌아오는 과정에서, 이전 상태로 되돌려 다음 후보를 동일한 기준에서 판단할 수 있도록 합니다.
이 과정은 매 단계마다 상태를 명확하게 구분하며, 각 선택이 독립적으로 평가될 수 있도록 합니다.
만약, 선택
, 검사
, 복원
절차 중 하나라도 누락되면, 이후 탐색이 잘못된 상태를 기반으로 진행되어 전체 탐색의 논리적 일관성이 무너지게 됩니다.
따라서 백트래킹은 단순한 재귀 호출이 아니라,
선택 → 검사 → 복원의 흐름을 일관되게 유지하며 탐색 대상의 정확성과 효율성을 동시에 확보하는 구조적인 탐색 기법입니다.
선택과 검사 (조건 판단과 탐색 경로 제한)
백트래킹은 가능한 모든 경우를 탐색할 수 있는 구조이지만,
실제로는 중간 단계에서 조건을 바탕으로 더 이상 유효하지 않은 경로를 조기에 배제함으로써 탐색의 효율을 높입니다.
이때 조건 판단은 다음과 같은 단계로 구성됩니다:
- 지금까지의 선택이 문제 조건을 만족하는지 평가하고,
- 이후 어떤 선택을 해도 정답에 도달할 수 없는 흐름이라면 더 이상 진행하지 않으며,
- 동일한 결과로 이어지는 경로의 반복 탐색을 방지하여 전체 탐색량을 줄입니다.
예를 들어, 정해진 합을 만족시켜야 하는 문제에서 현재까지 선택한 수의 합이 이미 목표를 초과했다면, 남은 어떤 수를 선택하더라도 조건을 만족할 수 없습니다.
이 경우 해당 경로는 더 이상 탐색하지 않고, 바로 이전 단계로 되돌아가게 됩니다.
이처럼 조건 판단은 탐색이 깊어지기 전에 불필요한 경로를 미리 배제함으로써 실제로 수행되는 탐색량을 크게 줄이는 핵심 요소입니다.
복원 (재귀 복귀 시 상태 복원)
백트래킹은 재귀 호출을 통해 여러 경로를 시도하므로,
각 경로가 이전 경로의 영향을 받지 않고 독립적으로 판단되기 위해서는 상태 복원이 필수적입니다.
따라서 탐색을 진행할 때, 적용된 선택을 검사하여 재귀 호출로 해당 경로의 탐색을 마친 후에는, 반드시 그 선택을 되돌려 이전 상태로 복원해야 합니다
만약, 상태가 누적된 채로 유지되면, 이후 탐색이 잘못된 전제에 기반하게 되어 정확한 해를 찾지 못하거나, 불필요한 경로를 탐색하게 됩니다.
즉, 복원 과정을 명시적으로 구현하지 않으면 탐색 흐름 전체의 논리적 일관성이 붕괴될 수 있습니다.
그러므로, 다음 후보를 정확한 기준에서 평가할 수 있도록 하기 위해 반드시 현재 상태를 이전 상태로 되돌려야 합니다.
예를 들어, 숫자를 하나 선택하고 해당 숫자를 사용 처리한 후 다음 탐색 단계로 진입한 경우,
재귀가 종료된 뒤에는 반드시 그 숫자를 다시 사용 가능한 상태로 돌려놓아야 이후 탐색이 동일한 기준에서 진행될 수 있습니다.
이처럼 백트래킹은 선택
과 검사
를 통해 탐색을 확장하고, 복원
을 통해 전체 탐색의 신뢰성을 유지하는 구조적 특징을 가집니다.
시간 복잡도와 탐색 깊이
백트래킹의 시간 복잡도는 가능한 모든 경우를 탐색하는 구조적 특성에서 비롯되며,
탐색의 깊이와 각 단계에서 선택 가능한 후보의 수에 따라 결정됩니다.
가장 단순한 형태의 시간복잡도 분석은 다음과 같은 최악의 경우를 기준으로 합니다:
여기서:
- \(b\)는 각 단계에서 고려할 수 있는 후보의 수,
- \(d\)는 전체 탐색의 깊이(즉, 선택의 단계 수)를 의미합니다.
이는 조건 판단이나 분기 제한이 전혀 적용되지 않은 상황을 가정한 것으로, 모든 경로를 끝까지 탐색했을 때의 이론적인 상한입니다.
하지만 백트래킹은 조건을 바탕으로 탐색의 방향을 제한하기 때문에,
이론적으로 가능한 모든 경로를 탐색하지 않고도 정답에 도달할 수 있는 구조를 가집니다.
또한, 탐색 깊이 \(d\)는 문제의 성격에 따라 달라지며,
각 단계에서는 남은 원소들 중 일부를 고려하게 되므로, 분기 수 \(b\)는 깊이에 따라 유동적으로 변할 수 있습니다.
예를 들어 \(N\)개의 원소 중에서 \(M\)개를 선택하는 조합 문제에서는 최대 깊이가 \(M\)이 됩니다.
결과적으로 백트래킹의 실제 효율성은 다음과 같은 두 요소에 따라 달라집니다:
- 탐색 깊이: 문제 구조에 따라 결정되는 최대 선택 단계
- 조건 제한의 정확성: 의미 없는 경로를 얼마나 빠르게 제외할 수 있는지
따라서 이론적 시간 복잡도보다 실제 실행 시간은 훨씬 작아질 수 있으며,
이는 조건 판단의 정밀도와 탐색 흐름의 구성 방식에 따라 결정됩니다.
마무리
백트래킹은 가능한 모든 경로를 체계적으로 살펴보면서, 문제의 제약을 이용해 불필요한 분기를 일찍 제거하는 효율적인 알고리즘 기법입니다.
특징을 정리하면 다음과 같습니다:
- 조건을 만족하는 경로만 따라가며 탐색 재귀 구조로 표현된 탐색 트리에서 각 선택이 제약을 충족하는지 확인한 뒤, 충족되는 경로만 다음 단계로 이어갑니다.
- 조건 기반 조기 배제 제약을 만족하지 않는 분기는 즉시 배제하여 불필요한 탐색을 줄입니다.
- 선택·검사·복원의 일관된 절차 각 단계에서 선택을 하고 조건을 확인한 뒤 상태를 복원함으로써 논리적 흐름을 유지합니다.
- 독립적 상태 평가 재귀 호출이 끝난 후 원래 상태로 복원하여, 서로 다른 분기가 간섭 없이 독립적으로 평가되도록 합니다.
또한, 실제 문제 해결에 백트래킹을 적용할 때는 다음과 같은 점을 고려하는 것이 좋습니다:
- 문제의 상태를 명확하게 정의하고, 선택 가능한 후보를 체계적으로 관리
- 가능한 빠르게 조건을 검사하여 불필요한 경로를 조기에 차단
- 상태 복원을 항상 확실히 수행하여 탐색의 논리적 일관성을 유지
백트래킹은 완전탐색의 기본 구조에 최적화를 더한 형태로, DFS(깊이 우선 탐색)와 같은 체계적인 탐색 방식을 사용합니다.
하지만, 백트래킹의 핵심적인 차이점은 조건 판단을 통해 탐색 경로를 조기에 배제함으로써 탐색 효율성을 크게 향상시킨다는 점입니다.
이러한 차이점으로 특히 조합적 문제, 제약 조건이 있는 구성 문제, 그리고 가능한 모든 해를 찾아야 하는 상황에서 유용하게 사용되고는 합니다.