Algorithm/이것이 코딩테스트다

[Algorithm] 03. 그리디 : 개념 & (1) 거스름돈 문제

Gaeun Lee 2022. 7. 4. 23:34

그리디 알고리즘

- 단순하지만 강력한 문제 해결 방법 

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

- 창의력, 즉 문제를 풀기 위한 최소한의 아이디어를 떠올릴 수 있는 능력을 요구 

- 기준에 따라 좋은 것을 선택하는 알고리즘이므로 문제에서 기준을 은근히 제시

 

 

[예제 3-1] 거스름돈

*문제

카운터에는 거스름돈으로 사용할 500원, 100원, 50원, 10원짜리 동전이 무한히 존재한다고 가정할 때 손님에게 거슬러 줘야 할 돈이 N원 (10의 배수)일 때 거슬러 줘야 할 동전의 최소 개수

 

*해설

가장 큰 화폐 단위부터 돈을 거슬러 주는 것

N원을 거슬러 줘야 할 때, 가장 먼저 500원으로 거슬러 줄 수 있을 만큼 거슬러 준 후 그다음 100원, 50원, 10원짜리 동전을 차례대로 거슬러 줄 수 있을 만큼 거슬러 주면 최소의 동전 개수로 모두 거슬러 줄 수 있음

n = 1260
count = 0

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

for coin in coin_types:
    count += n // coin # 해당 화폐로 거슬러줄 수 있는 동전의 개수 세기
    n %= coin
    
    # 500원
    # count = 0 + 1260 // 500 = 2
    # # n = 1260 % 500 = 260
    
    # 100원
    # count = 2 + 260 // 100 = 4
    # n = 260 % 100 = 60

    # 50원
    # count = 4 + 60 // 50 = 5
    # n = 60 % 50 = 10

    # 10원
    # count = 5 + 10 // 10 = 6
    # n = 10 % 10 = 0

print(count) # count = 6

 

그리디 알고리즘의 정당성

그리디 알고리즘으로 문제의 해법을 찾았을 때는 그 해법이 정당한지 검토해야 한다

 

거스름돈 문제를 그리디 알고리즘으로 해결할 수 있는 이유는 가지고 있는 동전 중에서 큰 단위가 항상 작은 단위의 배수이므로 작은 단위의 동전들을 종합해 다른 해가 나올 수 없기 때문이다

 

대부분의 그리디 알고리즘 문제에서는 이처럼 문제 풀이를 위한 최소한의 아이디어를 떠올리고 이것이 정당한지 검토할 수 있어야 답을 도출할 수 있다

 

어떤 코딩 테스트 문제를 만났을 때, 바로 문제 유형을 파악하기 어렵다면 그리디 알고리즘을 의심하고, 오랜 시간을 고민해도 그리디 알고리즘으로 해결 방법을 찾을 수 없다면, 앞으로 배울 다른 방법으로 접근하는 것도 하나의 방법이다