완전 탐색:
가능한 모든 경우를 전부 탐색하여 정답을 찾는 방식
백트래킹(원복):
불필요한 경우를 미리 제외하여 탐색 횟수를 줄이는 최적화 기법
🔹 개념:
#include <iostream>
#include <vector>
using namespace std;
vector<int> numbers = {1, 2, 3}; // 예제 데이터
// 모든 부분집합을 탐색하는 함수 (완전 탐색)
void bruteForce(int idx, vector<int> subset)
{
if (idx == numbers.size())
{ // 기저 사례 (모든 원소를 확인함)
cout << "{ ";
for (int num : subset) cout << num << " ";
cout << "}\n";
return;
}
// 1. 현재 숫자를 포함하는 경우
subset.push_back(numbers[idx]);
bruteForce(idx + 1, subset);
// 2. 현재 숫자를 포함하지 않는 경우
subset.pop_back(); // 원복(Backtrack)
bruteForce(idx + 1, subset);
}
int main()
{
vector<int> subset;
bruteForce(0, subset);
return 0;
}
🔹 시간 복잡도:
🔹 개념:
🔹 예제:
#include <iostream>
#include <vector>
using namespace std;
vector<int> numbers = {1, 2, 3};
int target = 6; // 특정 조건을 만족하는 경우만 탐색
void backtracking(int idx, vector<int> subset, int sum)
{
if (sum >= target) return; // 탐색 중단 (불필요한 경우 제거)
if (idx == numbers.size())
{ // 모든 원소 확인 완료
cout << "{ ";
for (int num : subset) cout << num << " ";
cout << "}\n";
return;
}
// 1. 현재 숫자를 포함하는 경우
subset.push_back(numbers[idx]);
backtracking(idx + 1, subset, sum + numbers[idx]);
// 2. 현재 숫자를 포함하지 않는 경우
subset.pop_back(); // 원복(Backtrack)
backtracking(idx + 1, subset, sum);
}
int main()
{
vector<int> subset;
backtracking(0, subset, 0);
return 0;
}
🔹 시간 복잡도 감소 효과:
방식 탐색 방식 시간 복잡도 최적화 가능 여부
완전 탐색 | 모든 경우 확인 | O(2^N) | ❌ (최적화 없음) |
백트래킹 | 불필요한 경우 가지치기 | O(2^N) → O(N log N) | ✅ (탐색 중단으로 최적화) |
✅ 백트래킹은 완전 탐색을 기반으로 하지만, "불필요한 경우를 제거"하여 탐색 속도를 개선하는 방식
📌 🚀 더 궁금한 점 있으면 질문 주세요! 😊
비트 마스킹 : 비트 연산자 (0) | 2025.03.05 |
---|---|
비트 마스킹 (0) | 2025.03.05 |
🚀 재귀를 활용한 완전 탐색 vs 백트래킹 비교! (0) | 2025.03.04 |
조합과 순열 의 수 : 4개중 2개 구하기 비교 (0) | 2025.03.03 |
조합과 순열 4개중 2개 뽑기 예제코드 (0) | 2025.03.03 |