초보 개발자의 일기

효율적인 화폐 구성 본문

코딩테스트/이것이 코딩테스트다.(Python)

효율적인 화폐 구성

판다꼬마 2022. 7. 22. 20:18
728x90

문제

 

 

 

입력

  • 첫째 줄에 N, M이 주어진다. (1 <=N <=100, 1 <=M <=10000)
  • 이후 N개의 줄에는 각 화폐의 가치가 주어진다. 화폐 가치는 10000보다 작거나 같은 자연수이다.

 

 

출력

  • 첫째 줄에 M원을 만들기 위한 최소한의 화폐 개수를 출력한다.
  • 불가능할 때는 -1을 출력한다.

 

입력 예시

2 15
2
3

출력 예시

5

풀이 방법

못 풀어서 솔류션을 보았다 ㅜㅜ

내 코드


# 정수 N, M을 입력 받기
n, m = map(int, input().split())
# N개의 화폐 단위 정보를 입력 받기
array = []
for i in range(n):
    array.append(int(input()))

# 한 번 계산된 결과를 저장하기 위한 DP 테이블 초기화
d=[0 for _ in range(n+1)]

# 다이나믹 프로그래밍(Dynamic Programming) 진행(보텀업)
d[0] = 0
for i in range(n):
    for j in range(array[i], m + 1):
        if d[j - array[i]] != 10001: # (i - k)원을 만드는 방법이 존재하는 경우
            d[j] = min(d[j], d[j - array[i]] + 1)

# 계산된 결과 출력
if d[m] == 10001: # 최종적으로 M원을 만드는 방법이 없는 경우
    print(-1)
else:
    print(d[m])

Solution


# 정수 N, M을 입력 받기
n, m = map(int, input().split())
# N개의 화폐 단위 정보를 입력 받기
array = []
for i in range(n):
    array.append(int(input()))

# 한 번 계산된 결과를 저장하기 위한 DP 테이블 초기화
d = [10001] * (m + 1)

# 다이나믹 프로그래밍(Dynamic Programming) 진행(보텀업)
d[0] = 0
for i in range(n):
    for j in range(array[i], m + 1):
        if d[j - array[i]] != 10001: # (i - k)원을 만드는 방법이 존재하는 경우
            d[j] = min(d[j], d[j - array[i]] + 1)

# 계산된 결과 출력
if d[m] == 10001: # 최종적으로 M원을 만드는 방법이 없는 경우
    print(-1)
else:
    print(d[m])

느낀 점

동적프로그래밍 그림을 그려서 풀면 쉬울 줄 알았는데

뭐 이리 어렵냐 ㅜㅜ

728x90

'코딩테스트 > 이것이 코딩테스트다.(Python)' 카테고리의 다른 글

플로이드 워셜 알고리즘  (0) 2022.07.31
최단 경로 (다익스트라 알고리즘)  (0) 2022.07.25
바닥 공사  (0) 2022.07.21
개미 전사  (2) 2022.07.12
1로 만들기  (1) 2022.07.10