브루트포스 알고리즘은 사실 설명하기 민망할 수 있을 정도로 직관적이다. 가능한 모든 경우를 따져가며 답을 찾는 방식. 따라서 시간만 충분하다면 이 방식으로 찾은 답은 정답임이 보장된다. 모든 경우를 다 따져본 거니까..
ex - 1) 1부터 N까지의 합은?
: 무식하게 풀자면, 1부터 N까지 숫자들을 하나하나 다 더해보면 됨. 시간은 좀 걸리지만 100% 확실한 정답을 보장.
sum = 0
for i in range(1, N + 1):
sum += N
ex - 2) 주어진 배열에 x라는 수가 있는가?
: 무식하게 풀자면, 주어진 배열의 원소를 순서대로 순회해보면 된다. 모든 원소를 순회해보면 있는지 없는지 100% 따질 수 있다.
N = 100
def solution(N, arr):
for i in arr:
if i == N:
return True
return False
이 방법의 최고 장점은 100% 확실한 답을 보장한다는 것. 그러나 단점은 시간이 오래 걸릴 확률이 매우 높다는 것!
최근 알고리즘 스터디를 시작했는데, 문제를 푸는 방법에 대해 설명을 들었다. 다음과 같다.
1. 우선 무식하게 접근해보기. 즉 브루트하게 풀려면 어떻게 할 수 있나 설계해보기
2. 설계한 브루트 방식의 시간복잡도를 계산해보고, 주어진 문제의 시간제한 내에 풀 수 있을 것 같으면 코드로 옮기기
3. 시간 내에 풀 수 없을 것 같으면 다른 방식으로 해보기. 설계했던 브루트한 방식을 어떻게 최적화할 수 있을지도 고민하기.
참고로 c++언어는 대략 1억번의 연산을 1초 내로 할 수 있고, 파이썬 언어는 대략 5천만번의 연산을 1초 내에 할 수 있다고 한다. 따라서 설계한 브루트한 방식의 시간복잡도가 O(n^2) 뭐 이런 식으로 나왔다면, 여기에 문제에서 n의 최댓값으로 주어지는 값을 넣어봐서 시간 내에 충분히 될 것 같으면 코드를 짜보라는 것. 참고로 애매하게 음 한 1억번 정도 연산할 것 같은데? 로 되지는 않고 100억번 정도 연산하네? 또는 100만번만 연산하네? 정도로 확실하게 주어진다고 한다.
'ALGORITHM > 알고리즘이론' 카테고리의 다른 글
크루스칼 알고리즘 - 최소 신장 트리 찾기 without codes (0) | 2023.02.03 |
---|---|
[알고리즘] 분리집합(Disjoint Set), a.k.a Union-Find알고리즘에 대해 (0) | 2021.10.02 |
[알고리즘] 너비우선탐색, BFS를 파이썬으로 차근차근 구현해보자 (0) | 2021.09.19 |
[알고리즘] 거듭제곱을 더 빠르게 구하는 방법 (0) | 2021.09.18 |