그리디 알고리즘(탐욕법)
- 현재 상황에서 지금 당장 좋은 것만 고르는 방법
- 일반적인 그리디 알고리즘은 문제를 풀기 위한 최소한의 아이디어를 떠올릴 수 있는 능력을 요구
- 최적의 해를 구하기
예제)
그리디 알고리즘은 이처럼 매 상황에서 최고의 상황만 선택한다.
- 일반적인 상황에서 최적의 해를 보장할 수 없다.
- 코딩테스트의 경우 이처럼 그리디 알고리즘으로 푸는 것이 최적의 해가 나오도록 설계되어 있다.
- 정당성 분석을 진행한다.
문제1 : 거스름 돈
문제1 : 1. 문제 해결 아이디어
- 최적의 해를 빠르게 구하기 위해서는 가장 큰 화폐 단위부터 돈을 거슬러 준다.
- N원을 거슬러 줘야 할 때, 가장 먼거 500원으로 거슬러 줄 수 있을 만큼 거슬러 준다.
- 이후에 100원, 50원, 10원짜리 동전을 차례대로 거슬러 준다.
문제1 : 2. 정당성 분석
- 큰 단위가 항상 작은 단위의 배수이므로 작은 단위의 동전들을 종합해 다른 해가 나올 수 없다.
- 화폐 단위가 500원, 400원 단위일 경우 400원의 배수는 500이 될 수 없기 때문에 그리디를 사용할 수 없다.
- 하지만 항상 전단위 화폐가 앞 단위 화폐의 배수이므로 가능하다.
문제 1 : 3. 풀이
n = 1260
count = 0
#큰 단위의 화폐부터 차례대로 확인하기
array = [500,100,50,10]
for coin in array:
count += n // coin #해당 화폐로 거슬러 줄 수 있는 동전의 개수 세기
n %= coin
print(count)
- 현재 금액에서 남아 있는 동전으로 최대한 나눠준다.
- count에는 계속 남은 n //coin (몫)이 계속 쌓인다.
- n은 남은 금액의 나머지가 쌓인다.
#실행 결과
6
문제 1 : 4. 시간 복잡도 분석
- 화폐의 종류가 K라고 할 때, 소스코드의 시간 복잡도는 O(K)이다.
- 이 알고리즘의 시간 복잡도는 거슬러줘야 하는 금액과는 무관하고, 화폐의 종류에만 영향을 받는다.
'CodingTest > 그리디 알고리즘' 카테고리의 다른 글
모험가 길드 (0) | 2022.07.05 |
---|---|
곱하기 혹은 더하기 (0) | 2022.07.05 |
1이 될 때까지 반복적으로 수행 (0) | 2022.07.05 |