[BOJ] 그리디 : 동전0(11047)

yozzum·2022년 6월 29일
0
  • 문제
    준규가 가지고 있는 동전은 총 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원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.

  • 예제 입력 1
10 4200
1
5
10
50
100
500
1000
5000
10000
50000
  • 예제 출력 1
6
  • 예제 입력 2
10 4790
1
5
10
50
100
500
1000
5000
10000
50000
  • 예제 출력 2
12
  • 내가 짠 코드(성공)

    직관적이다. 나누어 떨어지는 경우를 조건문으로 만들고, 나눈 수를 cnt에 더한 후에 k에서 해당 금액을 빼주는 작업이다.

n, k = map(int, input().split(" "))
lst = []
for i in range(n):
    lst.append(int(input()))

srted = sorted(lst, reverse=True)

cnt = 0
for c in srted:
    temp_cnt = k // c
    if temp_cnt > 0:
       cnt += temp_cnt
       k -= temp_cnt * c

print(cnt)
  • 내가 짠 코드2(성공)

    동전의 가치가 더 큰 경우에 몫은 0이되고, 나머지는 k값 그대로임을 생각하면 앞서 작성한 나누어 떨어지는 경우에 대한 조건문이 필요없다. 이런 경우에는 그냥 0을 cnt에 더하고, 같은 값이지만 나머지인 k를 다시 대입해주는 로직을 적용하면 된다.

n, k = map(int, input().split()) 
coin_lst = list()
for i in range(n):
    coin_lst.append(int(input()))

coin_lst.sort(reverse=True)
cnt = 0
for coin in coin_lst:
    cnt += k // coin
    k = k % coin
print(cnt)
profile
yozzum

0개의 댓글