Algorithm Problem/Python

[python] 백준 - 11047. 동전 0

deo2kim 2020. 7. 2. 17:01
반응형

문제 해결

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

 

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

 

문제

준규가 가지고 있는 동전은 총 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원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.

 

반응형