[알고리즘] 브루트포스(Brute Force)

2025. 1. 22. 11:11·CS/알고리즘

"모든 가능성을 전부 다 시도하는 가장 단순하지만 확실한 방법"

 

브루트포스 알고리즘이란?

브루트포스(Brute Force)는
가능한 모든 경우를 일일이 다 시도하여 답을 찾는 알고리즘입니다.

"뇌 대신 힘으로 푼다!"는 말이 어울리는 방법입니다.

  • 가능한 모든 입력을 직접 탐색해서 정답을 찾습니다.
  • 수학적으로 '완전 탐색(Exhaustive Search)'이라고도 부릅니다.
  • 최적화나 특별한 트릭 없이 문제를 정면으로 해결합니다.

왜 브루트포스가 필요한가?

"다 시도하는 거 비효율적이지 않나?"라고 생각할 수 있습니다.
하지만 다음과 같은 이유로 브루트포스는 여전히 중요합니다.

  • 문제 크기가 작을 때는 최적의 방법
  • 정답이 확실히 보장됨 (모든 경우를 다 보기 때문에)
  • 디버깅이나 검증에 유용 (정답 체크용)
  • 복잡한 문제를 단순화할 수 있음
  • 다른 알고리즘의 기초가 되는 경우가 많음 (예: 백트래킹, 최적화)

실제 코딩 테스트나 초창기 프로토타입 개발에서도 많이 사용됩니다.

브루트포스 알고리즘 동작 방식

브루트포스는 모든 가능한 조합이나 경우를 순회하며,
각 경우마다 조건을 검사해 정답을 찾습니다.

기본 흐름

  1. 가능한 모든 경우를 생성한다.
  2. 각 경우를 하나씩 꺼내 조건을 검사한다.
  3. 조건을 만족하면 답으로 기록한다.
  4. 모든 경우를 다 검사할 때까지 반복한다.

예시 코드 (Python)

# 1부터 100까지 중, 2개 숫자의 합이 50이 되는 쌍 찾기
for i in range(1, 101):
    for j in range(1, 101):
        if i + j == 50:
            print(i, j)

1~100 사이의 모든 숫자 쌍을 다 시도합니다.


브루트포스의 장단점

장점

항목 설명
구현이 매우 쉽다 복잡한 알고리즘 지식 없이도 코딩 가능
항상 정답을 찾을 수 있다 모든 경우를 보기 때문에 실수 가능성 없음
문제 분석에 도움 문제의 본질을 직관적으로 파악할 수 있음

단점

항목 설명
시간 복잡도가 매우 높다 경우의 수가 기하급수적으로 늘어남
대규모 데이터에 불리하다 시간 초과(TLE) 발생 가능성 높음
메모리 사용량도 커질 수 있다 경우의 수를 저장하는 경우 공간 복잡도 문제 발생

 

대표적인 브루트포스 문제 예시

비밀번호 찾기

  • 비밀번호를 맞출 때 가능한 모든 조합을 시도해보는 것
  • 예: 4자리 숫자(0000~9999) 전부 입력해보는 공격

조합/순열 생성

  • 모든 조합 또는 순열을 만들어야 하는 문제
  • 예: n개의 숫자 중 k개를 선택하는 모든 경우 출력

특정 조건을 만족하는 수열 찾기

  • 주어진 조건을 만족하는 수열을 전부 시도해본다
  • 예: N개의 숫자 중 합이 S가 되는 경우 찾기

완전 탐색 게임 문제

  • 미로 찾기, 퍼즐 완성 등
  • 가능한 모든 이동 경로를 시도하는 방식

브루트포스 최적화 전략

브루트포스를 무조건 "느린 알고리즘"이라고 단정할 필요는 없습니다.
몇 가지 전략을 통해 브루트포스도 현실적으로 사용 가능하게 만들 수 있습니다.

경우의 수 줄이기 (Pruning)

  • 불필요한 경우를 미리 걸러낸다.
  • 예: 합이 이미 초과한 경우 이후 탐색을 중단
def find_combination(arr, target):
    for a in arr:
        if a > target:
            continue  # target 넘으면 무시
        for b in arr:
            if a + b > target:
                continue
            if a + b == target:
                print(a, b)

조합/순열 라이브러리 활용

  • Python에서는 itertools 라이브러리를 사용해 코드 간결화
  • combinations, permutations 등 제공
from itertools import combinations

arr = [1, 2, 3, 4, 5]
for comb in combinations(arr, 2):
    if sum(comb) == 5:
        print(comb)

문제 크기를 제한하는 전제 조건 확인

  • 문제에서 입력 크기가 작으면 브루트포스 사용 가능성 높음
  • 예: "N ≤ 10" 같은 조건

병렬 처리

  • 경우의 수가 크지만 독립적이면 멀티스레드, 멀티프로세싱 활용
  • 예: 대규모 패스워드 크래킹 시 병렬로 탐색

마무리 정리

항목 요약
브루트포스 정의 가능한 모든 경우를 다 시도하는 알고리즘
강점 구현 간단, 항상 정답 보장
약점 느린 시간 복잡도, 대규모 문제에 불리
대표 문제 비밀번호 맞추기, 조합/순열 문제, 경로 탐색 등
최적화 방법 가지치기, 경우의 수 줄이기, 병렬 처리

 

728x90
'CS/알고리즘' 카테고리의 다른 글
  • [알고리즘] 백트래킹(Backtracking)
츄핑
츄핑
    250x250
  • 츄핑
    개발로그
    츄핑
  • 전체
    오늘
    어제
    • 분류 전체보기
      • CS
        • 자료구조
        • 알고리즘
        • 운영체제
        • 네트워크
        • 데이터베이스
        • 인프라
        • Web
      • PS
        • 백준
      • JavaScript
        • React
        • Express
        • NestJS
        • TypeScript
        • Node.js
        • Electron
      • Java
        • Spring
      • Dart
        • Flutter
      • PHP
        • CodeIgniter
      • etc
        • 이산수학
        • 선형대수학
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    오블완
    티스토리챌린지
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
츄핑
[알고리즘] 브루트포스(Brute Force)
상단으로

티스토리툴바