본문 바로가기

코딩테스트/백준

[C/Python] 브루트포스

🚀 [알고리즘 정복] 무식하지만 확실한 힘, 브루트포스(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:
    1. 슬라이딩 윈도우: 전체 보드를 8x8 크기로 한 칸씩 밀며 탐색.
    2. 패턴 판별: (행 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