Algorithm/Greedy

[백준 11047번] 동전 0

킹우현 2023. 2. 7. 11:55

n, k = map(int,input().split())

value = []
count = 0

for i in range(n):
  value.append(int(input()))

value.sort(reverse=True)

while k!=0:
  for i in value:
    if k//i > 0:
      count += k//i
      k %= i

print(count)

이번 문제는 대표적인 Greedy 알고리즘 문제로, 주어진 동전 단위들을 가지고 최소한의 동전을 사용하여 금액(k)를 만드는 것이 핵심이다.

 

여기서 가장 중요한 조건은 바로 A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수이다.

 

왜 저 조건이 중요한지 생각해보면, 이 문제를 간단하게 탐욕적으로 접근해서 풀 수 있는 이유는 가지고 있는 동전 중에서 큰 단위가 항상 작은 단위에 배수이기 때문이다. (작은 단위의 곱으로 큰 단위를 만들 수 있으므로 작은 단위의 곱으로 만들 필요 없이 큰 단위 하나로 만들면 동전의 개수를 최소화할 수 있기 때문)

 

만약에 저 조건이 없이 동전 단위들이 주어진다면 단순히 탐욕적으로 풀이할 수 없다.

ex) k = 800 , 단위 = [ 500, 400, 100 ] 의 경우, 단순히 탐욕적으로 풀이하면 500 + 100 + 100 + 100 이지만 500과 400은 배수의 관계가 아니기 때문에 풀리지 않는다. 이 경우 정답은 400 + 400 이다.

 

따라서 그리디 알고리즘 문제는 이처럼 문제 풀이를 위한 아이디어를 떠올리고 이것이 탐욕적으로 접근하는 것이 정당한지 검토할 수 있어야한다 !

'Algorithm > Greedy' 카테고리의 다른 글

[백준 1026번] 보물  (0) 2023.02.07
[백준 1931번] 회의실 배정  (0) 2023.02.07
[백준 11399번] ATM  (0) 2023.02.06
[백준 2839번] 설탕 배달  (0) 2023.02.06
[이코테] 무지의 먹방 라이브  (0) 2023.02.05