[프로그래머스 level 3][JAVA] 12907번: 거스름돈

2025. 11. 14. 21:47·코테/프로그래머스
728x90

[level 3] 거스름돈 - 12907

문제 링크

성능 요약

메모리: 94.8 MB, 시간: 61.18 ms

문제 설명

Finn은 편의점에서 야간 아르바이트를 하고 있습니다. 야간에 손님이 너무 없어 심심한 Finn은 손님들께 거스름돈을 n 원을 줄 때 방법의 경우의 수를 구하기로 하였습니다.

예를 들어서 손님께 5원을 거슬러 줘야 하고 1원, 2원, 5원이 있다면 다음과 같이 4가지 방법으로 5원을 거슬러 줄 수 있습니다.

  • 1원을 5개 사용해서 거슬러 준다.
  • 1원을 3개 사용하고, 2원을 1개 사용해서 거슬러 준다.
  • 1원을 1개 사용하고, 2원을 2개 사용해서 거슬러 준다.
  • 5원을 1개 사용해서 거슬러 준다.

거슬러 줘야 하는 금액 n과 Finn이 현재 보유하고 있는 돈의 종류 money가 매개변수로 주어질 때, Finn이 n 원을 거슬러 줄 방법의 수를 return 하도록 solution 함수를 완성해 주세요.

제한 사항
  • n은 100,000 이하의 자연수입니다.
  • 화폐 단위는 100종류 이하입니다.
  • 모든 화폐는 무한하게 있다고 가정합니다.
  • 정답이 커질 수 있으니, 1,000,000,007로 나눈 나머지를 return 해주세요.

입출력 예
n money result
5 [1,2,5] 4
입출력 예 설명

입출력 예 #1
문제의 예시와 같습니다.

 

풀이과정

예시1

 

빨간색으로 색칠된 부분은 자기 자신, money(2)에서는 n이 2일 때 2인 자기 자신의 경우의 수로 추가된다.

dp[i][j] = dp[i-1][j] + dp[i][j-money[i-1]

두번째 줄을 보면 2(1,2)이 1,2를 조합해서 경우의 수를 만드는데 1 = 1 / 2 = 1+1, 2 / 3=1+1+1, 2+1라는 경우의 수가 있다.

여기서 규칙을 찾아 낼 수 있다. money(2)에서 n을 표현하려면 table[1][2]는 table[0][2]를 표현하는 경우의 수와 table[1][2-2]를 표현하는 경우의 수를 더한 것이라는 거다.

 

i=1부터 시작한다. i=0 행은 “동전을 하나도 사용하지 않은 경우”를 의미하는 초기값으로 사용한다.

dp 행 번호(i) 실제 의미 사용 가능한 동전

0 동전 없음 []
1 money[0]만 사용 [1]
2 money[0], money[1] 사용 [1,2]
3 money[0], money[1], money[2] 사용 [1,2,5]

 

예시2

다른 수의 배열을 살펴보자

한 가지 규칙을 더 발견할 수 있다. dp[i][j] = dp[i-1][j];

자기 자신이 나타나기 전의 경우의 수는 위에서 표현한 경우와 수와 같다.  

money(7)에서 10을 표현한 경우의 수와 8에서 10-8, money(8)에서 2를 표현한 경우의 수를 더해주는 것이다.

2를 표현한 경우의 수에서 8을 더하면 10이 되니까 어떻게든 2를 표현했다면 8을 더해주기만 하면 10이 되기 때문이다.

dp[i][10] = dp[i-1][10] + dp[i][10 - 8]  = dp[i-1][10] + dp[i][2]

 

자바 코드

class Solution {
    int[][] dp;
    
    public int solution(int n, int[] money) {
        dp = new int[money.length+1][n+1];
        int answer = 0;
        
        for(int i = 1; i < money.length+1; i++) {
            for(int j = 0; j < n+1; j++) {
                if(j == 0)
                    dp[i][j] = 1;
                else {
                    if(j < money[i-1])
                        dp[i][j] = dp[i-1][j];
                    else
                        dp[i][j] = (dp[i-1][j] + dp[i][j-money[i-1]]) % 1000000007;
                }
            }
        }
        return dp[money.length][n];
    }
}

 

출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges

참고:https://tosuccess.tistory.com/57

 

728x90
반응형

'코테 > 프로그래머스' 카테고리의 다른 글

[프로그래머스 level 1][JAVA/자바] 12930번: 이상한 문자 만들기  (0) 2025.11.16
[프로그래머스 Level2]SELECT:부모의 형질을 모두 가지는 대장균 찾기-SQL  (0) 2025.04.25
[프로그래머스 Level2]SELECT:조건에 맞는 개발자 찾기-SQL  (0) 2025.04.25
[프로그래머스 Level3]GROUP BY:대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기-SQL  (0) 2025.03.21
[프로그래머스 Level3]DP:N으로 표현-JAVA (자바)  (0) 2025.03.17
'코테/프로그래머스' 카테고리의 다른 글
  • [프로그래머스 level 1][JAVA/자바] 12930번: 이상한 문자 만들기
  • [프로그래머스 Level2]SELECT:부모의 형질을 모두 가지는 대장균 찾기-SQL
  • [프로그래머스 Level2]SELECT:조건에 맞는 개발자 찾기-SQL
  • [프로그래머스 Level3]GROUP BY:대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기-SQL
lakedata
lakedata
lakedata 님의 블로그 입니다.
  • lakedata
    lakedata 님의 블로그
    lakedata
  • 전체
    오늘
    어제
    • 분류 전체보기 (188)
      • cs (82)
        • dev (28)
        • sec (29)
        • ops (25)
      • 자격증 (32)
        • 정보처리기사 (20)
        • 정보보안기사 (1)
        • aws dva (6)
        • aws dop (2)
      • IT서적 (27)
        • 클린아키텍처 (10)
        • 객체지향의사실과오해 (7)
        • 오브젝트 (10)
      • 코테 (42)
        • 알고리즘 (20)
        • 백준 (13)
        • 프로그래머스 (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    Java
    알고리즘
    CS
    docker
    AWS
    Spring
    SQL
    Security
  • 최근 댓글

  • 최근 글

  • 반응형
    250x250
  • hELLO· Designed By정상우.v4.10.3
lakedata
[프로그래머스 level 3][JAVA] 12907번: 거스름돈
상단으로

티스토리툴바