브루트포스 알고리즘 (Brute Force Algorithm)
1. 개념 정의
- 브루트포스 알고리즘이란 가능한 모든 경우의 수를 전부 탐색하여 정답을 찾는 가장 기본적인 탐색 방식이다.
- 일반적으로 구현이 쉽고 직관적이지만,
- 시간 복잡도가 높기 때문에 입력 크기가 클 경우 비효율적일 수 있다.
2. 특징
- 탐색 방식: 가능한 모든 경우를 하나씩 대입하며 확인한다.
- 장점: 구현이 매우 간단하며 논리적으로 명확하다.
- 단점: 시간 복잡도가 매우 높아 비효율적이다.
- 적용 예시: 작은 입력 크기의 문제나 정답의 범위가 제한된 경우에 사용된다.
3. 시간 복잡도 분석
3.1 일반적인 시간 복잡도
- 브루트포스는 일반적으로 입력 크기 n에 대해 O(n!), O(2^n), O(n^2) 등 매우 높은 시간 복잡도를 가진다.
- 예를 들어, 비밀번호를 찾기 위해 가능한 모든 조합을 시도할 경우 조합의 수에 비례한 시간이 소요된다.
3.2 예시
- 1~100까지의 숫자 중 특정 숫자를 찾기 위한 선형 탐색의 경우: O(n)
- n개의 숫자로 이루어진 순열을 모두 만들어보는 경우: O(n!)
4. 브루트포스 알고리즘의 대표적인 예시
4.1 비밀번호 대입 공격 (Password Cracking)
- 설명: 가능한 모든 비밀번호 조합을 하나씩 입력하며 확인하는 방식이다.
- 예시: 알파벳 소문자 3자리 비밀번호 → 26^3 = 17,576 가지 경우의 수가 존재한다.
4.2 순열 및 조합 탐색
- 설명: 주어진 원소들로 만들 수 있는 모든 순열이나 조합을 만들어보며 조건을 만족하는지 검사한다.
- 예시: 외판원 순회 문제 (TSP, Traveling Salesman Problem)
4.3 문자열 패턴 매칭
- 설명: 텍스트에서 패턴 문자열을 찾기 위해 한 문자씩 대입하며 비교하는 방식이다.
- 예시: KMP 등의 최적화 전 기초적인 문자열 탐색 방식
5. 구현 예제 (Python)
5.1 비밀번호 찾기
# 3자리 숫자 비밀번호 찾기
password = "123"
for i in range(1000):
attempt = str(i).zfill(3)
if attempt == password:
print("비밀번호는:", attempt)
break
5.2 문자열에서 패턴 찾기
def brute_force(text, pattern):
n = len(text)
m = len(pattern)
for i in range(n - m + 1):
match = True
for j in range(m):
if text[i + j] != pattern[j]:
match = False
break
if match:
return i
return -1
print(brute_force("abcdefg", "cde")) # 출력: 2
6. 브루트포스를 피해야 할 경우
6.1 입력 크기가 클 경우
- 탐색 공간이 기하급수적으로 증가하기 때문에 효율적인 알고리즘(예: 그리디, 동적 계획법 등)을 사용하는 것이 바람직하다.
6.2 시간 제한이 촉박한 문제
- 알고리즘 문제 풀이에서 제한 시간이 짧거나 탐색해야 할 경우의 수가 많다면 브루트포스는 적합하지 않다.
7. 브루트포스를 사용할 수 있는 전략
7.1 가지치기 (Pruning)
- 불필요한 탐색을 미리 차단하여 시간 복잡도를 줄인다.
- 예: 백트래킹에서 조건을 만족하지 않으면 탐색을 중단한다.
7.2 메모이제이션 (Memoization)
- 이미 계산한 결과를 저장하여 중복 계산을 피한다.
7.3 문제 범위 제한 확인
- 입력 범위가 매우 작을 경우, 브루트포스가 유효한 전략이 될 수 있다.
'Language > 알고리즘' 카테고리의 다른 글
계수 정렬 (0) | 2025.04.23 |
---|---|
소수 판별 알고리즘: 제곱근 최적화 방식 (0) | 2025.04.21 |
Python deque (0) | 2025.04.08 |
증가하는 부분 수열 (LIS: Longest Increasing Subsequence) (0) | 2025.04.07 |
누적합 (0) | 2025.04.05 |