Algorithm

[이코테] 3. 그리디

hyeonzzz 2024. 1. 16. 00:03

그리디

: 현재 상황에서 지금 당장 좋은 것만 고르는 방법

 

※ 그리디 알고리즘은 기준에 따라 좋은 것을 선택하는 알고리즘이므로 문제에서 '가장 큰 순서대로', '가장 작은 순서대로'와 같은 기준을 제시해준다!

※ 그리디 알고리즘 문제는 자주 정렬 알고리즘과 짝을 이뤄 출제된다

 

 

거스름돈 문제 예시

거슬러 줘야 할 돈이 N원일 때 거슬러줘야 할 동전의 최소 개수를 구하라 (N은 항상 10의 배수이다)

 

해결방법

가장 큰 화폐 단위부터 돈을 거슬러 준다

 

예를 들어 N이 1,260이라면 

500원 2개
100원 2개
50원 1개
10원 1개

 

 

파이썬 코드

n = 1260
count = 0

#큰 단위의 화폐부터 차례대로 확인
coin_types = [500, 100, 50, 10]

for coin in coin_types:
	count += n // coin  #해당 화폐로 거슬러 줄 수 있는 동전의 개수 세기
    n %= coin
    
print(count)

 

 

시간 복잡도

화폐의 종류만큼 반복을 수행해야 하므로

화폐의 종류가 K개 이면 시간복잡도는 O(K)이다

 

 

그리디 알고리즘의 정당성

대부분의 문제는 최적의 해를 찾을 수 없을 가능성이 다분하다

하지만 탐욕적으로 문제에 접근했을 때 정확한 답을 찾을 수 있다는 보장이 있을 때는 매우 효과적이다

그리디 알고리즘은 그 해법이 정당한지 검토해야 한다. 거스름돈 문제를 그리디로 해결할 수 있는 이유는 큰 단위가 항상 작은 단위의 배수이므로, 작은 단위의 동전들을 종합해 다른 해가 나올 수 없기 때문이다