문제 해결
1. 그리디 알고리즘. S1
2. 큰 동전부터 순차적으로 for문을 돌리며
(1) 목표값 k 보다 작은 동전이 나왔을 때 그 동전의 값을 뺄 수 있는 만큼 빼준다.
ex) 45원이 남았을 때 10원짜리 동전이 나왔다면 계산을 통해 10원을 4번 빼주고 카운트를 4 올려준다.
(2) 빼준 값만큼 k값을 줄여가며 동전을 0원으로 만든다.
(3) 누적된 cnt 값을 출력해주면 끝
🌞 탐색알고리즘을 해결할 땐 시간을 최적화 하는게 중요한 것 같다.
❓처음 해결방법: 동전값을 찾았을 때 while문으로 동전을 하나씩 빼줬는데 시간 초과가 났다.
❓두번째 해결방법: k값이 0이 됐음에도 불구하고 나머지 for문을 돈다고 생각하여 break문을 추가했다.
이것도 시간 초과. 사실 별로 도움이 안된거 같다.
❗마지막 해결방법: while문에서 많은 시간을 쓴다고 생각해서 하나씩 빼주는 대신 몫을 계산하여 한번 계산으로 값을 빼주고 카운트를 올려줬다. 성공🚩
소스 코드
n, k = map(int, input().split())
coins = [int(input()) for _ in range(n)]
cnt = 0
for i in range(n-1, -1, -1):
# while coins[i] <= k:
# k -= coins[i]
# cnt += 1
if coins[i] <= k:
mok = k // coins[i]
k -= coins[i]*mok
cnt += mok
# 가지
if k == 0:
break
print(cnt)
출처: BACKJOON ONLINE JUDGE
문제: 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원을 만드는데 필요한 동전 개수의 최솟값을 출력한다. |
'Algorithm Problem > Python' 카테고리의 다른 글
[python] 백준 - 2941. 크로아티아 알파벳 (0) | 2020.07.05 |
---|---|
[python] 백준 - 11399. ATM (0) | 2020.07.03 |
[python] 백준 - 1316. 그룹 단어 체커 (0) | 2020.06.24 |
[python] 백준 - 1697. 숨바꼭질 (0) | 2020.06.23 |
[python] 백준 - 2178. 미로 탐색 (4) | 2020.06.22 |