완전 탐색은 가능한 모든 경우의 수를 전부 확인하여 문제를 해결하는 방법
쉽게 말해 "가능한 모든 방법을 일일이 다 해보는 것"
완전 탐색의 장단점
장점
단점
완전 탐색은 모든 문제 해결의 기본이 되는 좋은 시작점입니다. 하지만 문제의 복잡도가 높아지거나 처리해야 할 데이터의 양이 늘어날수록 실행 시간이 기하급수적으로 증가하게 됩니다. 따라서 코딩 테스트에서는 상황에 맞는 최적화된 알고리즘(그리디, 백트래킹, 동적 계획법 등)을 선택하여 문제를 해결해야합니다. 즉, 완전 탐색은 문제의 크기와 상황을 고려하여 전략적으로 사용해야 합니다.
for문이나 while문을 사용하여 가능한 모든 경우를 순차적으로 탐색하는 방법그리디 알고리즘은 현재 상황에서 가장 좋아 보이는 선택을 하는 방법
쉽게 말해 "각 단계에서 최적이라고 생각되는 것을 선택하는 것"
그리디 알고리즘의 장단점
그리디 알고리즘의 두 가지 필수 조건
탐욕 선택 속성
각 단계에서 선택한 방법이 이후의 결정과 상관없이 최종 답의 최적성을 유지해야 합니다.
예시) 회의실 배정 문제
[회의 시간표]
A팀: 1시~4시
B팀: 3시~5시
C팀: 5시~7시
[선택 과정]
첫 선택: "가장 빨리 끝나는" A팀 선택
-A팀이 4시에 끝나기 때문에 이후 시간대에 더 많은 회의를 배정할 수 있음
-이 선택이 "최대 회의 수"라는 최종 목표 달성에 최선!
최적 부분 구조
전체 문제의 최적해가 문제를 나눈 각 부분 문제의 최적해를 결합해서 얻을 수 있어야 합니다.
예시) 거스름돈 문제
[상황] 거스름돈 1260원 (동전: 500원, 100원, 50원, 10원)
[해결 과정]
1.가장 큰 단위(500원)로 최대한 거스름돈을 해결 → 500원 2개 사용
2.남은 금액(260원)을 같은 방식으로 해결
- 100원 2개 → 200원
- 50원 1개 → 50원
- 10원 1개 → 10원
각 단계의 "최대한 큰 동전 사용하기"의 결과가 모여서 전체 문제의 "최소 동전 개수"라는 최적해를 만듬
탐욕 선택 속성: 문제 해결 과정에서 현재 선택의 정당성을 보장하는 것이 중요합니다.
- "각각의 선택"에 초점최적 부분 구조: 문제를 분할하여 최적해를 조합할 수 있는 구조인지 확인해야 합니다.
- "문제의 구조"에 초점
이 두 조건이 모두 만족되어야 그리디 알고리즘을 사용할 수 있습니다!
만족하지 않으면 다른 알고리즘(완전 탐색, 동적 계획법 등)을 고려해야 해요.
1. 수학적 증명
"가장 확실한 증명 방법이지만, 난이도가 높습니다"
```
[귀류법을 통한 회의실 배정 문제 증명 예시]
* 귀류법: 어떤 명제가 참임을 증명하기 위해, 그 명제가 거짓이라고 가정한 후 모순을 이끌어내는 증명 방법입니다.
1단계) 가정
- "가장 일찍 끝나는 회의(A)를 선택하지 않는 최적해가 있다"고 가정
2단계) 최적해 분석
- 최적해의 첫 회의를 B라고 하자
- B의 종료 시간은 A의 종료 시간보다 늦거나 같음
3단계) 교체 가능성 증명
- B를 A로 교체해도:
* 회의 시간이 겹치지 않음 (A가 더 일찍 끝나므로)
* 나머지 회의 일정에 영향 없음
* 그런데 A를 선택하면 오히려 더 많은 시간을 확보할 수 있음
4단계) 결론
- B를 A로 교체 후 상황 분석
* 최소한 같은 개수의 회의를 진행할 수 있음
* 더 많은 시간이 확보되어 더 많은 회의가 가능할 수도 있음
- 최종 증명
* "A를 선택하지 않는 것이 최적"이라는 가정이 모순
* "가장 일찍 끝나는 회의(A)를 선택하는 것이 최적해"임이 증명됨
```
2. 작은 예시로 검증
```
[동전 거스름돈 문제 검증]
테스트 케이스 1: 작은 금액
- 상황: 160원
- 과정:
1) 100원 1개 (남은 금액: 60원)
2) 50원 1개 (남은 금액: 10원)
3) 10원 1개
- 결과: 3개의 동전 사용으로 최적해
테스트 케이스 2: 각 동전의 배수
- 상황: 500원
- 결과: 500원 1개로 최적해
테스트 케이스 3: 모든 동전 필요
- 상황: 660원
- 과정:
1) 500원 1개 (남은 금액: 160원)
2) 100원 1개 (남은 금액: 60원)
3) 50원 1개 (남은 금액: 10원)
4) 10원 1개
- 결과: 4개의 동전이으로 최적홰
```3. 반례 찾기
"그리디 알고리즘이 실패하는 경우 찾기"
```
[잘못된 동전 구성의 반례]
상황: 동전 {500원, 400원, 100원}으로 800원 거슬러주기
그리디 방식:
1) 500원 선택 (남은 금액: 300원)
2) 100원 3개 사용
→ 총 4개 동전 사용
최적해:
1) 400원 2개 사용
→ 총 2개 동전으로 해결 가능
결론: 이런 반례가 있다면 그리디 접근이 부적절
```
4. 기존 문제와의 비교
예시) 회의실 배정 vs 활동 선택 문제
1. 공통점
- 시간이 겹치지 않게 선택
- 종료 시간 기준 정렬 사용
2. 차이점
- 회의실: 한 개의 회의실에서 최대 회의 수
- 활동 선택: 여러 활동 중 겹치지 않는 최대 활동 수
3. 결론
- 구조가 같으므로, 같은 그리디 접근 가능
💡 Tip!
두 알고리즘의 특징을 비교해 볼게요.
| 항목 | 완전 탐색 | 그리디 알고리즘 |
|---|---|---|
| 접근 방식 | 모든 경우의 수를 탐색 | 각 단계에서 최적 선택 |
| 최적해 보장 | 항상 보장 | 특정 조건에서만 보장 |
| 상대적 시간복잡도 | 높음 | 낮음 |
| 적용 범위 | 문제의 제한 시간 초과가 나지 않는 모든 문제 | 탐욕 선택 속성과 최적 부분 구조의 조건을 만족하는 문제 |
❗ 각 문제마다 어떤 알고리즘을 선택해야 할지 완벽한 공식은 없지만, 알고리즘을 유형별로 정확히 배우고 다양한 문제를 풀어보면서 상황에 맞는 최적의 알고리즘을 선택할 수 있습니다.
완전 탐색을 사용하는 경우
그리디 알고리즘을 사용하는 경우