코딩테스트/백준

[Python] 백준 11047번. 동전 0

jungmin.park 2023. 11. 24. 10:03

https://www.acmicpc.net/problem/11047

 

11047번: 동전 0

첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)

www.acmicpc.net

 

문제:

최소 동전의 갯수를 찾는 문제이다.

4200원이 주어졌을때 1000 * 4 와 100 *2 동전 6개로 최솟값을 찾을 수 있다.

 

풀이 설계

  • p는 인덱스로 사용한다.
  • k가 nlist[p] 보다 작으면 동전의 값이 더 크기 때문에 인덱스 값을 증가시켜준다.
    • ex) 4200 < 5000
  • k가 nlist[p]보다 크면 
    • cnt = k // nlist[p] 예시로 1000 위치까지 가면 4200 // 1000 => 4개를 구할 수 있다.
    • k 는 k % nlist[p] 나머지를 저장해준다.
import sys

input = sys.stdin.readline
n, k = map(int, input().split())
nlist=[int(input()) for i in range(n)]
p=0
cnt=0

while k != 0:
	# k가 nlist[p] 보다 작으면 동전의 값이 더 크기 때문에 인덱스 값을 증가시켜준다
    if k > nlist[p]:
        p += 1
    # k가 nlist[p]보다 크면
    elif k <= nlist[p]:
        p -= 1
        cnt += k // nlist[p]
        # k 는 k % nlist[p] 나머지를 저장
        k -= k % nlist[p]
        p = 0

print(cnt)

 

풀이제출결과 틀렸습니다가 나왔다.

 

코드를 보니

  • list를 역순으로 정렬하면 더 빨리 찾을 수 있다
  • for문을 사용하여 값을 꺼내면 인덱스를 사용할 필요가 없다.
import sys

input = sys.stdin.readline
n, k = map(int, input().split())
nlist=[int(input()) for i in range(n)]
# list를 역순으로 정렬하면 더 빨리 찾을 수 있다
nlist.sort(reverse=True)
cnt=0

for num in nlist:
    if k < num:
        continue
    cnt += k // num
    k = k % num

    if k == 0:
        break

print(cnt)