치춘짱베리굿나이스

[백준] 17212 본문

C C++/알고리즘풀이

[백준] 17212

치춘 2023. 8. 16. 22:37

달나라 토끼를 위한 구매대금 지불 도우미

문제

달나라 토끼들이 사용하는 화폐는 동전뿐이다. 동전의 종류는 1원, 2원, 5원, 7원 이렇게 4종류가 있다. 물건을 사고 동전으로 계산을 하는데 동전의 개수가 최소가 되도록 지불하지 않는 것은 불법이다. 예를 들어, 17원을 지불할 때 7원짜리 동전 1개와 5원짜리 동전 2개로 지불해야 합법이고, 7원짜리 동전 2개와 2원짜리 동전 1개, 1원짜리 동전 1개로 지불해도 17원이 되지만, 총 동전의 개수가 4개가 되어 최소 개수가 아니므로 불법이다.

지불 금액을 입력받아 합법이 되는 동전 개수를 출력으로 내어주는 프로그램을 작성해보자.

입력

첫 번째 줄에 달나라 토끼가 지불해야하는 금액 N(0 ≤ N ≤ 100,000)이 주어진다.

출력

첫 번째 줄에 달나라 토끼가 합법적으로 낼 수 있는 동전의 개수를 출력한다.

풀이

#include <iostream>
#include <algorithm>

int dp[100001];

int main(void) {
    int n;

    std::cin >> n;
    dp[1] = 1;
    dp[2] = 1;
    dp[3] = 2;
    dp[4] = 2;
    dp[5] = 1;
    dp[6] = 2;
    dp[7] = 1;

    for (int i = 8; i <= n; i++)
        dp[i] = std::min(std::min(std::min(dp[i - 7], dp[i - 5]), dp[i - 2]), dp[i - 1]) + 1;
    std::cout << dp[n];
}

반성회

dp[i]dp[i - 7], dp[i - 5], dp[i - 2], dp[i - 1] 중 한 개를 선택하여 동전 하나를 추가하면 된다

(동전은 7원, 5원, 2원, 1원이 존재)

따라서 위의 4개 경우 중 가장 동전의 개수가 가장 적은 것을 선택해 1을 더해주면 되는 문제

std::min을 3번 겹쳐야 해서 너저분하긴 한데 이것보다 나은 방법이 있는진 잘 모르겠다

'C C++ > 알고리즘풀이' 카테고리의 다른 글

[백준] 11052  (0) 2023.08.19
[백준] 11051  (0) 2023.08.17
[백준] 13301  (0) 2023.08.15
[백준] 2828  (0) 2023.08.13
[백준] 1904  (0) 2023.08.12
Comments