브루트포스 구현 레퍼런스
대표 브루트포스 패턴 — 모든 쌍, 부분집합, 격자 전수 검사 — 을 코드로 정리하고
함정을 짚습니다.
1. 모든 쌍/세 쌍 검사
int n; cin >> n;
int a[1000];
for (int i = 0; i < n; i++) cin >> a[i];
int best = 0;
for (int i = 0; i < n; i++)
for (int j = i + 1; j < n; j++)
best = max(best, a[i] + a[j]); // 두 수 합의 최대
cout << best << '\n';
a = list(map(int, input().split()))
best = max(a[i] + a[j] for i in range(len(a)) for j in range(i+1, len(a)))
print(best)
2. 모든 부분집합 (비트로 표현)
원소가 적을 때(\(N \le 20\) 정도) 각 원소를 넣고/빼는 모든 조합을 봅니다.
int n; cin >> n; // 작은 N
for (int mask = 0; mask < (1 << n); mask++) { // 0 ~ 2^n - 1
int sum = 0;
for (int i = 0; i < n; i++)
if (mask & (1 << i)) sum += a[i]; // i번째를 골랐다면
// sum = 이 부분집합의 합
}
from itertools import combinations
# 모든 부분집합을 직접:
for mask in range(1 << n):
chosen = [a[i] for i in range(n) if mask & (1 << i)]
s = sum(chosen)
1 << n은 \(2^n\)입니다. N이 조금만 커도 폭발하니 N 한계를 꼭 확인하세요.
3. 격자 전수 검사
// 모든 시작 칸에서 어떤 모양이 들어가는지 검사
for (int i = 0; i + H <= n; i++) // H, W 크기 도형
for (int j = 0; j + W <= m; j++) {
// (i,j)를 좌상단으로 하는 영역 검사
}
가능한 모든 위치를 빠짐없이 시도하는 전형적 격자 브루트포스입니다.
4. 함정과 패턴 인식
- 경우의 수 폭발 — N이 큰데 \(2^N\)이나 \(N^3\)을 돌리면 시간 초과. 먼저 어림셈.
- 중복 카운팅 — 쌍은
j>i, 같은 조합을 두 번 세지 않기.
- 후보 누락 — 범위(
<= vs <)를 잘못 잡아 끝 경우를 빠뜨림.
- 오버플로 — 합/곱이 클 수 있으면
long long.
문제에 "가능한 모든", "N이 작다(≤20, ≤100)", "최대/최소가 되는 경우를 찾아라",
"모든 위치를 시도" 같은 신호가 보이면 브루트포스입니다.
정리
브루트포스 구현은 (1) 먼저 경우의 수 어림셈, (2) 한 개/쌍/부분집합/격자의 표준
틀로 모든 후보 생성, (3) 빠짐없이·중복 없이, (4) 합·곱은 long long — 이 흐름을
따르면 됩니다. N이 작다는 조건은 거의 항상 "전부 해 봐라"는 신호입니다.