일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- algorithm
- 알고리즘
- javascript
- 라이브템플릿
- 최단경로
- HTTP
- springboot
- Greedy
- counting elements
- Dijkstra
- beandefinitionstoreexception
- brute force
- error
- java
- API
- Spring
- 프로그래머스
- 2018 KAKAO BLIND RECRUITMENT
- 소수
- 2981
- 백준
- 탐욕법
- BFS
- spring security
- Python
- codility
- 파이썬
- 문자열
- 코딩테스트
- applicationeventpublisher
- Today
- Total
Altiora Petamus
동전 0 본문
출처 : https://www.acmicpc.net/problem/11047
문제
준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다.
동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000)
둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)
출력
첫째 줄에 K원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.
# 예제 입력
10 4200
1
5
10
50
100
500
1000
5000
10000
50000
# 예제 출력
6
풀이
뭔가 장황하지만 결국 동전의 가치를 정의한 후 제시된 금액을 최대한 적은 갯수의 동전으로 바꿔달라는 문제입니다. 다음과 같은 순서로 풀어보았습니다.
동전의 가치를 배열에 담아놓는다.
가치가 큰 동전부터 나눠보며 나머지를 순차적으로 계산해나간다.
각 단계의 몫을 저장한다.
💡
입력을 오름차순으로 주므로 insert를 사용해서 앞에서부터 값을 넣으면 정렬할 필요가 없지만, 이번엔 append를 사용한 후 내림차순 정렬했습니다.
n, target = map(int, input().split())
a = []
for _ in range(n):
a.append(int(input()))
a.sort(reverse=True)
i = 0
answer = 0
while target != 0:
# > 로 했다가 런타임 에러가 발생. 모든 동전이 target보다 값이 크거나 같다면?
if target >= a[i]:
answer += target // a[i]
target %= a[i]
i += 1
else:
i += 1
print(answer)
무한루프를 돌지 않게 주의해서 코드를 작성합니다. 저는 검증 중에 무한루프로 인한 런타임 에러에 걸려서 뭐가 잘못된건지 한참을 쳐다봤네요.
문제의 조건에 target은 항상 동전의 가치보다 크다는 조건이 없기때문에 조심해야 합니다. 저는 결국 예외코드를 보고서야 = 를 빼먹었다는걸 알았습니다.
이 카테고리를 처음 작성할 땐 파이썬이 익숙치않아서 자바스크립트를 사용해서 푼 후 파이썬으로 변환했는데, 최근은 자바스크립트를 사용하지 않아도 문제를 풀 수 있게 되어서 기분이 좋습니다 ㅎㅎ