본문 바로가기
Algorithm

[DP/동적계획법] 백준 14916 거스름돈 - 파이썬(Python)

by jangThang 2023. 7. 3.
반응형

백준 온라인 저지

 

[ Contents ]

     

     

    1. 문제 (링크 참조)

     

    14916번: 거스름돈

    첫째 줄에 거스름돈 액수 n(1 ≤ n ≤ 100,000)이 주어진다.

    www.acmicpc.net

     

     

    2. 문제 풀이

    거스름돈을 2원과 5원 동전으로 거슬러주는 문제입니다. 이때 거슬러주는 동전의 개수는 최소가 되어야 합니다.

     

    2022.01.31 - [Algorithm] - [그리디/Greedy] 백준 11047 동전 0 - Python

     

    [그리디/Greedy] 백준 11047 동전 0 - Python

    [ Contents ] 1. 문제 (링크 참조) 11047번: 동전 0 첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 =

    star7sss.tistory.com

     각 동전의 단위가 배수가 아니므로 그리디 알고리즘은 사용할 수 없습니다. 우리나라의 화폐단위는 10, 50, 100, 500, 1000, 5000, 10000, 50000으로 하위 화폐로 상위 화폐의 액수를 만들 수 있습니다.

     그래서 무조건 고액권부터 고려해서 거스름돈을 계산하면 쉽게 해결됩니다. 하지만 2원과 5원은 배수 관계가 아니므로 동적계획법으로 일일이 경우의 수를 고려해야 합니다.

     

     

    3. 코드

    from collections import deque
    import sys
    input = sys.stdin.readline
    
    # 입력
    n = int(input())
    
    # DP
    if n == 1:
        print(-1)
    elif n == 2:
        print(1)
    elif n == 3:
        print(-1)
    elif n == 4:
        print(2)
    else:
        dp = [100000] * (n + 1)
        dp[2] = 1
        dp[4] = 2
        dp[5] = 1
    
        for i in range(5, n+1):
            dp[i] = min(dp[i], dp[i-2]+1, dp[i-5]+1)
    
        print(-1 if dp[n] == 100000 else dp[i])

     1부터 5까지는 세팅을 해줍니다. 그래야 dp[i-5]에서 오류가 나지 않습니다.

     

    dp[i] = min(dp[i], dp[i-2]+1, dp[i-5]+1)

     가장 중요한 코드입니다.

     dp[i-2]는 2원을 거슬렀을 경우를 뜻하며, dp[i-5]는 5원을 거슬렀을 경우를 뜻합니다. 여기서 dp는 거스름돈 동전의 개수입니다.

     

    dp[10] = min(dp[10], dp[8]+1, dp[5]+1)

     예를 들어 i = 10인 경우, 8원에서 2원을 더한 경우(dp[8]+1)5원에서 5원을 더한 경우(dp[5]+1) 중 최소값을 찾습니다.

     이렇게 5부터 n까지 세 가지 경우 중에 최소값을 갱신하며 정답을 구합니다.

     

     

    star가 되고나서 Tistory

    반응형

    댓글