[Algorithm] 브루트 포스 알고리즘
🌵 브루트포스 알고리즘(Brute Force Search)이란?
brute : 무식한 + force : 힘
brute force : 폭력
완전 탐색, 전체 탐색 알고리즘으로 불리며, 발생할 수 있는 모든 경우를 탐색한다.
쉽게 말해 4자리 비밀번호를 맞추기 위해 브루트포스 알고리즘을 사용하면,
0000부터 9999까지의 모든 숫자조합을 시도해 비밀번호를 찾는 것이다.
🌵 장점
- EASY
- 알고리즘을 설계, 구현하기가 매우 쉽다.
- 정답률 100%
- 해가 하나 이상 존재한다는 가정을 세우고 구현하므로, 100%의 확률로 정답을 찾을 수 있다.
🌵 단점
- 시간 초과 가능성
- 모든 경우를 탐색하므로 실행시간이 오래걸린다.
- 비효율적
- 메모리 효율측면에서 비효율적이다.
🌵 종류
브루트포스의 종류는 크게 두 가지로 분류된다.
1. 선형 구조 : 순차 탐색
2. 비선형 구조 : 백트레킹, 깊이 우선 탐색 (DFS, Depth First Search), 너비 우선 탐색 (BFS, Breadth First Search)
각각의 더 자세한 설명은 추후에 공부하고 추가하도록 하자!
- 순차탐색 (Sequential Search)
- 처음부터 끝까지 차례대로 비교하여 원하는 값을 찾아내는 알고리즘
- 단방향으로 탐색을 수행하기 때문에 선형 탐색(Linear Search)이라고도 불린다.
- 단순하지만, 비효율적
- 백트레킹 (Backtracking)
- 해를 찾는 도중 해가 아니어서 막히면, 되돌아가서 다시 해를 찾아가는 기법
- 즉, 모든 경우의 수들 중 특정 조건을 만족하는 경우만 살펴본다.
- 반복문의 횟수를 줄일 수 있다.
- 불필요한 부분을 쳐내고 최대한 올바른 쪽으로 간다는 의미로 가지치기라고도 불린다.
- 깊이 우선 탐색 (DFS, Depth First Search)
- 루트 노드(혹은 다른 임의의 노드)에서 시작해서 다음 분기(branch)로 넘어가기 전에 해당 분기를 완벽하게 탐색
- 말이 어려운데 이름 그대로 넓게 탐색하기 전에 깊게 탐색하는 것!
- 쉬운 예로 설명하면, 미로에서 길을 탐색할 때 한 방향으로 갈 수 있을 때까지 가다가 길이 막히면,
가장 가까운 갈림길로 돌아와 다른 방향의 길을 탐색하는 것이다.
- 너비 우선 탐색 (BFS, Breadth First Search)
- 루트 노드(혹은 다른 임의의 노드)에서 시작해서 인접한 노드를 먼저 탐색
- 시작 정점으로부터 가까운 정점을 먼저 방문하고 멀리 떨어져 있는 정점을 나중에 방문하는 순회 방법
🌵 문제해결 방법
1. 주어진 문제를 선형 구조로 구조화
2. 구조화된 문제공간을 적절한 방법으로 해를 구성할 때까지 탐색
3. 구성된 해를 정리
브루트포스 알고리즘을 이욯한 문제들을 통해 이해하면 더 쉽게 이해할 수 있다.
🌵 관련 문제
[백준 알고리즘 2798번 : 블랙잭]
https://www.acmicpc.net/problem/2798
[SOLUTION]
https://gyurisinzorba.tistory.com/40
[백준 알고리즘 2231번 : 분해합]
https://www.acmicpc.net/problem/2231
[SOLUTION]
https://gyurisinzorba.tistory.com/41
[백준 알고리즘 7568번 : 덩치]
https://www.acmicpc.net/problem/7568
[SOLUTION]
https://gyurisinzorba.tistory.com/42
[백준 알고리즘 1436번 : 영화감독 숌]
https://www.acmicpc.net/problem/1436
[SOLUTION]
https://gyurisinzorba.tistory.com/43