• Jan
  • Feb
  • Mar
  • Apr
  • May
  • Jun
  • Jul
  • Aug
  • Sep
  • Oct
  • Nov
  • Dec
  • Sun
  • Mon
  • Tue
  • Wed
  • Thu
  • Fri
  • Sat
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

#5585 거스름돈

image

image

문제 정리

언제나 거스름돈 개수가 가장 적게 잔돈을 준다고 했으니, 액수가 큰 동전부터 주면 된다 (다 약수관계 이므로 최적해)
1000원에서 지불할 돈을 뺀 후에, 남은 돈을 동전 중에 가장 큰 단위부터 차례대로 빼주면 끝!

생각해보기

만약에 내는 돈이 1000원이 아니라 2000이여서 거스름돈이 1573원이라고 치자…
그러면 맨 처음에 500으로 나눠서 몫을 구하고, 몫이 1이상이면
500 * 몫을 거스름돈에서 빼주고 남은 거스름돈에 대해서도 마찬가지로 100, 50, … 이렇게 해주면 된다.
물론 몫들은 최종 답 변수에 더해주고!

아 걍 나머지 연산자 쓰면 되잖아?

코드 쓰기

몫 연산자 : /
나머지 연산자 : %

if (change / 500 >= 1) {
        answer += change / 500;
        change = change % 500;
    }

요 코드를 숫자만 바꿔서 반복해주면 되니까, 반복문을 써서 한 번에 해결하자 ~!! LOC 줄이기 대작전..~

내 풀이

// BOJ-5585 거스름돈
#include <iostream>
using namespace std;

int main() {
    int price, change, answer = 0;
    cin >> price;

    change = 1000 - price;
    
    // 동전 종류 : 500, 100, 50, 10, 5, 1
    int coins[6] = {500, 100, 50, 10, 5, 1};

    for (int i=0; i < 6; i++){
        if (change / coins[i] >= 1) {
        answer += change / coins[i];
        change %= coins[i];
        }
    }

    cout << answer;
}

풀고 나서 알게된 것

순간 c++에서 배열 어떻게 선언하는지 까먹음 ㅋㅋㅋㅋ 정신이 나갔구나…
그리고 coins.count coins.size 다 안돼서 뭔가 했더니 sizeof()를 써야 하는 거였다…