암호학에서의 bruteforce attack이 아닌,
알고리즘적인 차원에서 bruteforce란 다음과 같다.
brute : 무식한, force : 힘
컴퓨터의 강력한 연산속도로 가능한 모든 경우의 수를 탐색하면서 요구 조건에 충족되는 결과를 가져온다.
선형구조를 전체적으로 탐색하는 순차 탐색,
비선형 구조를 전체적으로 탐색하는 깊이 우선 탐색(DFS), 너비 우선 탐색(BFS) 등이 가장 기본적인 도구이다.
10의 약수의 합을 구하기
10의 약수가 될 수 있는 모든 수 ⇒ 정수겠죠?
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10} → 문제의 해가 될 수 있는 수를 선형으로 구성하였다.
자료가 선형이므로, 순차탐색으로 첫 원소부터 마지막 원소까지 탐색한다.
만약 해당 인덱스가 10에 나누어 떨어진다면 약수이기 때문에, 결과값에 더해준다.
최종적으로 1, 2, 5, 10이 더해져서 18이 된다.
가능한 모든 경우의 수를 구할 때나, 수학적 공식을 세우기 어려울 때 사용한다.
단, Bruteforce 알고리즘은 때에따라 시간복잡도가 엄청나게 증가할 수 있다.
그 점에 유의하여 코드를 짜야한다.
다음은 BOJ bruteforce문제를 풀다가 시간초과가 났었던 문제이다.
#include <iostream>
using namespace std;
int main(void)
{
int p1, p2, p3, x1, x2, x3;
cin >> p1 >> p2 >> p3 >> x1 >> x2 >> x3;
int N;
for (N = 1; N <= p1 * p2 * p3; N++)
{
if (N % p1 == x1 && N % p2 == x2 && N % p3 == x3)
{
cout << N << endl;
return (0);
}
}
cout << "-1" << endl;
}