그리디(greedy) 알고리즘은 단어 그대로 탐욕법이라고도 한다.
단순하면서도 강력한 알고리즘으로 반드시 알아야 하는 알고리즘 중 하나이다.
그리디 알고리즘은 뜻 그대로 바로 눈앞의 이익만을 좇는 알고리즘을 말한다.
그리디 알고리즘은 최적화 문제를 대상을 하고 그리디 알고리즘은 그 문제를 해결하기 위한 최소한의 아이디어를 떠올릴 수 있는 능력을 요구한다.
즉, 특정한 문제를 직면했을 때, 단순히 현재 상황에서 최적으로 보이는 것만을 선택해도 문제를 풀 수 있는지 파악해야 한다.
또한, 그리디 알고리즘 문제는 정렬 알고리즘과 자주 짝을 이룬다. 정렬을 한 상태에서 기준을 만족시키는 경우가 많기 때문이다.
그리디 알고리즘에 대표적인 예시로 '거스름 돈' 문제를 이용해 그리디 알고리즘을 설명해 보겠다.
문제: 카운터에는 거스름돈으로 사용할 500원, 100원, 50원, 10원짜리 동전이 무한히 존재한다고 가정하고, 손님에게 거슬러 줘야 할 돈이 N원일 때 거슬러 줘야 할 동전의 최소 개수를 구하여라. 단, 거슬러 줘야 할 돈 N은 항상 10의 배수이다.
이 문제는 그리디 알고리즘을 이용해 풀 수 있는 대표적인 문제로 간단한 아이디어만 떠올릴 수 있으면 문제를 해결할 수 있다. 바로 '가장 큰 화폐 단위부터' 돈을 거슬러 주는 것이다.
N=int(input())
count = 0
# 큰 단위의 화폐부터 차례로 확인.
coin_types = [500 , 100, 50, 10]
for coin in coin_types:
count += n // coin #해당 화폐로 거슬러 줄 수 있는 동전의 개수
n %= coin
print(count)
화폐의 종류가 K라고 할 때 이 코드의 시간 복잡도는 O(K) 이다.
하지만 대부분의 그리디 알고리즘 문제는 이처럼 문제 풀이를 위한 최소한의 아이디어를 떠올리고 이것이 정당한지 검토할 수 있어야 정답을 도출할 수 있다.
그리디 알고리즘의 핵심은 늘 '최적해'를 구하는 것이다.
'PROGRAMMING > ALGORITHM' 카테고리의 다른 글
이진트리와 이진 검색트리 (1) | 2022.12.13 |
---|---|
트리 구조 (0) | 2022.12.12 |
셸 정렬/퀵 정렬/병합 정렬/힙 정렬 (0) | 2022.12.09 |
정렬 알고리즘 (버블 정렬/ 선택 정렬/ 삽입 정렬) (0) | 2022.12.09 |
해시법 (Hashing) (0) | 2022.12.05 |