Oops, All Code!/🤯 Oops, My Algorithm!
( ु ´͈ ᵕ `͈ )ु JS:: 코딩테스트를 위한 완전탐색과 탐욕법
밍동망동
2024. 7. 24. 23:04
완전 탐색과 탐욕법은 몇 번 사용해보면 다른 매커니즘을 통해 돌아가지만,
사실 코딩테스트 학습 초반에는 꽤나 헷갈렸던 알고리즘이다.
어떤 경우에 사용하는지 간단하게 정리해보겠다.
완전탐색(Brute Force)
완전탐색은 왜 Brute Force(무자비한 힘)일까?
이 방법이 무차별 공격처럼 가능한 모든 경우를 하나하나 시도하기 때문이다.
이러한 무식한 방법 때문에 Brute(야수, 잔인한)라는 단어가 사용되었다.
힘으로 밀어붙이는 상황처럼, 가능한 모든 경우를 다 시도해본다는 의미에서 파생되었다.
직관적이고 단순하지만 비효율적일 수 있다.
이 알고리즘은, 미로 안에서 출구를 찾기 위해 모든 길을 가보는 것과도 같다.
모든 경로를 시도하며 출구를 찾게되면, 반드시 출구를 찾겠지만 시간이 많이 걸릴 수 있다.
조합 문제
- 예) 여러 개의 숫자 중 3개의 숫자를 선택해 그 합이 0이 되는 조합을 찾기
퍼즐 문제
- 예) 퍼즐의 모든 배치를 시도해 정답을 찾는 문제
// 세 개의 숫자를 선택해 그 합이 0이 되는 경우의 수
function findTriplets(arr) {
let count = 0;
const n = arr.length;
for (let i = 0; i < n - 2; i++) {
for (let j = i + 1; j < n - 1; j++) {
for (let k = j + 1; k < n; k++) {
if (arr[i] + arr[j] + arr[k] === 0) {
count++;
}
}
}
}
return count;
}
console.log(findTriplets([-2, 3, 0, 2, -5])); // 결과: 2
탐욕법(Greedy Algorithm)
매 순간 최적이라고 생각되는 선택을 해 문제를 해결하는 방법
현재 상황에서 가장 좋아 보이는 선택을 하며 문제를 해결한다.
이러한 선택이 최종적으로 최적의 해결책을 보장할 수 있을 때 사용한다.
이 알고리즘은 마치 산에 오를 때, 현재 위치에서 가장 높은 곳으로만 이동하는 것과 같다.
빠르게 정상에 오를 수 있지만, 항상 최적의 경로가 되는 것은 아니다.
따라서 근시안적으로 최선의 선택을 하며 전체적으로 최적의 해결책을 찾을 때 사용한다.
거스름돈 문제
- 예) 가장 큰 단위의 동전부터 차례로 거슬러줌
최소 비용 문제
- 예) 문제를 해결하는 과정에서 항상 현재 가장 저렴한 비용을 선택함
두 알고리즘의 차이
완전탐색 | 탐욕법 | |
시간복잡도 | n이 많을수록 기하급수적 상승 | 일반적으로 더 빠르지만, 항상 최적의 해결책을 보장하지 않음 |
사용 조건 | n의 크기가 작을 때 | 각 선택이 무조건적으로 최적의 해결책을 보장할 때 |
예시 | 숨겨진 보물을 찾기 위해 모든 경로 탐색 | 높은 곳에서 더 높은 곳으로 정상 오르기 |