🚀 [알고리즘 정복] 무식하지만 확실한 힘, 브루트포스(Brute-force)
안녕하세요! 오늘은 알고리즘의 가장 기본이자 강력한 해결책인 브루트포스(Brute-force) 단원을 마무리하며 학습 내용을 정리해 보려 합니다. '무식한 힘'이라는 이름처럼, 모든 가능성을 전부 확인하여 정답을 찾는 이 기법은 알고리즘 설계의 기초 체력을 기르는 데 최적입니다.
1. 브루트포스란?
모든 경우의 수를 다 대입해 보는 완전 탐색 알고리즘입니다.
- 장점: 반드시 정답을 찾을 수 있고 구현이 직관적이다.
- 단점: 데이터가 많아지면 실행 시간이 기하급수적으로 늘어난다 (O(N^2), O(2^N) 등).
- 핵심: "이 문제를 제한 시간 내에 모든 경우를 다 훑어서 풀 수 있는가?"를 판단하는 능력!
2. 주요 문제별 핵심 로직 & 회고
🃏 블랙잭 (2798번) - "조합의 기초"
- 내용: N장의 카드 중 3장을 골라 M에 가장 가까운 합 만들기.
- Point: 중복 없는 3중 for문의 설계.
- C++ Tip: for(int i=0; i<n-2; i++) 처럼 인덱스 범위를 정확히 제한하여 불필요한 연산을 방지함.
🔢 분해합 (2231번) - "탐색 범위의 최적화"
- 내용: 어떤 자연수 N의 생성자 찾기.
- Point: 1부터 N까지 다 돌 수도 있지만, 생성자의 최소 범위를 **N - (9 * {자릿수})**로 설정하여 연산 횟수를 획기적으로 줄임.
- 보안적 시각: 무차별 대입 공격(Brute-force Attack)에서도 탐색 범위를 좁히는 것이 효율성의 핵심임을 체감.
📐 수학은 비대면강의입니다 (19532번) - "수학 vs 알고리즘"
- 내용: 연립방정식의 해 구하기.
- Point: 크라메르 공식 같은 복잡한 수학 공식 대신, x, y의 범위(-999 ~ 999)를 이용한 이중 루프 전수 조사로 해결.
🏁 체스판 다시 칠하기 (1018번) - "2차원 배열 탐색"
- 내용: N * M 보드에서 8 * 8 체스판을 잘라 최저 수정 횟수 찾기.
- Point:
- 슬라이딩 윈도우: 전체 보드를 8x8 크기로 한 칸씩 밀며 탐색.
- 패턴 판별: (행 index + 열 index) % 2의 홀짝성을 이용해 체스판 패턴 비교.
- C++ 실력 향상: vector<string>과 포인터를 활용한 메모리 접근 연습.
🎬 영화감독 숌 (1436번) - "문자열 패턴 매칭"
- 내용: '666'이 포함된 N번째 숫자 찾기.
- Point: 숫자를 1씩 증가시키며 문자열로 변환(to_string, str) 후, 패턴 포함 여부를 확인.
- C++ Tip: s.find("666") != string::npos를 이용한 존재 여부 판별.
3. Python vs C++: 두 언어의 매력
이번 단원을 공부하며 같은 로직을 두 언어로 구현해 보았습니다.
- Python: if "666" in s 처럼 코드가 매우 직관적이고 슬라이싱이 편해 로직을 빠르게 검증할 때 유리함.
- C++: vector의 reserve()를 이용한 최적화, size_t 자료형을 이용한 보안적 코딩, 포인터를 통한 메모리 제어 등 시스템 리소스 관리의 중요성을 배움.
💡 학습 후기 및 다음 단계
브루트포스를 풀면서 "과연 이게 효율적인가?"라는 의문이 들 때도 있었지만, **"정확한 해를 구하는 것"**이 알고리즘의 시작임을 깨달았습니다. 특히 2026년 4월 정보처리기사 실기를 준비하며, 이러한 기초 로직들이 코드 해석 문제의 핵심이 될 것 같다는 확신이 들었네요.
'코딩테스트 > 백준' 카테고리의 다른 글
| [C/Python] 집합과 맵 (0) | 2026.03.14 |
|---|---|
| [C/Python] 정렬 (0) | 2026.03.13 |
| [C/Python] 시간 복잡도 (0) | 2026.03.08 |
| [C/Python] 기하 1: 직사학형과 삼각형 (0) | 2026.03.07 |
| [C/Python] 약수, 배수와 소수 1 (0) | 2026.03.06 |