코딩테스트/BOJ

[BOJ] 14916 거스름돈 - JAVA

5월._. 2023. 6. 20.
728x90

1. 문제

 

14916번: 거스름돈

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

www.acmicpc.net

춘향이는 편의점 카운터에서 일한다.

손님이 2원짜리와 5원짜리로만 거스름돈을 달라고 한다. 2원짜리 동전과 5원짜리 동전은 무한정 많이 가지고 있다. 동전의 개수가 최소가 되도록 거슬러 주어야 한다. 거스름돈이 n인 경우, 최소 동전의 개수가 몇 개인지 알려주는 프로그램을 작성하시오.

예를 들어, 거스름돈이 15원이면 5원짜리 3개를, 거스름돈이 14원이면 5원짜리 2개와 2원짜리 2개로 총 4개를, 거스름돈이 13원이면 5원짜리 1개와 2원짜리 4개로 총 5개를 주어야 동전의 개수가 최소가 된다.


2. 풀이

dp를 처음에 N+1로 채운다. 초기값을 0으로 만들면 최솟값을 선택할 때 방해가 되기 때문이다. 

dp[2],dp[5]에 초기값 1을 저장해야하기 때문에 dp 크기는 N의 최대값이 100,000까지 수용되도록 했다.

dp[6]부터 dp[N]부터 값을 구하기 위해 dp[2]에 미리 2를 넣었다.

dp[i]는 dp[i-2]와 dp[i-5]의 최솟값 + 동전하나다. 

dp를 모두 채운 후에 dp[N]이 초기값 N+1과 동일하다면 -1을, 다르다면 dp[N]을 출력한다.

import java.io.*;
import java.util.*;

public class BOJ_14916_거스름돈 {
   public static void main(String[] args) throws IOException {
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      int N = Integer.parseInt(in.readLine());
      int[] dp = new int[100_001];
      Arrays.fill(dp, N+1);
      dp[2] = dp[5] = 1;
      dp[4] = 2;
      for(int i=6;i<=N;i++){
         dp[i] = Math.min(dp[i-2], dp[i-5])+1;
      }

      if(dp[N]==N+1) System.out.println(-1);
      else System.out.println(dp[N]);

   }
}

3. 결과

'코딩테스트 > BOJ' 카테고리의 다른 글

[BOJ] 10942 팰린드롬? - JAVA  (0) 2023.06.24
[BOJ] 17086 아기 상어 2 - JAVA  (0) 2023.06.21
[BOJ] 2776 암기왕 - JAVA  (0) 2023.06.19
[BOJ] 16928 뱀과 사다리 게임 - JAVA  (0) 2023.06.18
[BOJ] 9019 DSLR - JAVA  (0) 2023.06.17

댓글