[알고리즘] - 거스름 돈 (백준 5585번)

이창희·2023년 1월 6일
0

알고리즘

목록 보기
4/7

문제


타로는 자주 JOI잡화점에서 물건을 산다. JOI잡화점에는 잔돈으로 500엔, 100엔, 50엔, 10엔, 5엔, 1엔이 충분히 있고, 언제나 거스름돈 개수가 가장 적게 잔돈을 준다. 타로가 JOI잡화점에서 물건을 사고 카운터에서 1000엔 지폐를 한장 냈을 때, 받을 잔돈에 포함된 잔돈의 개수를 구하는 프로그램을 작성하시오.

입력


입력은 한줄로 이루어져있고, 타로가 지불할 돈(1 이상 1000미만의 정수) 1개가 쓰여져있다.

출력


제출할 출력 파일은 1행으로만 되어 있다. 잔돈에 포함된 매수를 출력하시오.

문제 해결아이디어


  • 최적의 해를 빠르게 구하기 위해서는 가장 큰 화폐 단위부터 돈을 거슬러 주면 된다.
  • N원을 거슬러 줘야 할 떄, 가장 먼저 500엔을 거슬러 줄 수 있을 만큼 거슬러 주고 이후에 100, 50, 10, 5, 1,엔 순으로 거슬러 줄 수있으만큼 거슬러 주면된다.

정당성 분석


  • 가장 큰 화폐 단위부터 돈을 거슬러 주는 것이 최적의 해를 보장하는 이유는?
    • 가지고 있는 동전 중에서 큰 단위가 항상 작은 단위의 배수이므로 작은 단위의 동전들을 종합해 다른 해가 나올 수 없기 때문이다.
  • 만약 800 원을 거슬러 줘야하는데 400원 단위가 있다면 2개가 최적의 해가 되었을 것이다.

시간 복잡도 분석


  • 화폐의 종류가 K라고 할 때, 소스코드의 시간 복잡도는 O(K)이다.
  • 이 알고리즘의 시간복잡도는 거슬러줘야 하는 돈과는 무관하며 거슬러주 주는 동전의 종류의 따라 달라집니다.

해결한 코드


public class BJ_5585 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int money = 1000 - sc.nextInt();
        int[] coin = {500,100,50,10,5,1};
        int count = 0;

        for(int i :coin){
            count += money/i;
            money = money%i;
        }

        System.out.println(count);
    }

}
profile
백앤드 개발자를 꿈꾸는 개발자 지망생입니다.

0개의 댓글