프론트엔드/알고리즘

파이썬 Python | 알고리즘 | 백준 거스름돈

YUNI Heo 2024. 8. 13. 23:25
반응형

⭕ 파이썬 Python | 알고리즘 | 백준 거스름돈

➡️ 문제링크

 

➡️ 문제 탐색하기

  • 그리디(Greedy) 알고리즘: 그리디 알고리즘은 매 순간 최적의 선택을 하여 전체 문제의 최적해를 찾아가는 방식이다. 이 문제에서 그리디 알고리즘을 사용하는 이유는 화폐 단위가 배수 관계 화폐 단위가 큰 것부터 사용하여 최적의 해를 빠르게 구할 수 있기 때문이다. 큰 단위의 동전부터 차례대로 선택하지 않으면, 더 많은 동전을 사용하게 되어 비효율적인 해를 도출할 수 있다. 따라서, 동전 단위를 큰 것부터 작은 것 순서대로 리스트에 저장하고, 순차적으로 거슬러 주는 방식을 사용한다.
  • 큰 단위의 동전부터 사용하면 최적의 해를 보장할 수 있는 이유는, 큰 단위의 동전이 작은 단위의 동전으로 구성될 수 없기 때문이다. 예를 들어, 500엔은 100엔 동전 다섯 개로 교환할 수 있지만, 그리디 알고리즘에서는 500엔 동전을 먼저 사용하기 때문에 최적해를 빠르게 찾을 수 있다.
  • 시간 복잡도: 동전의 종류 K개만큼 반복을 수행하므로, 시간 복잡도는 O(K)이다. 동전의 종류가 총 6개이므로, 6번정도의 연산이 필요하고 시간초과를 고민하는 것이 의미가 없을 정도이다.

 

➡️ 코드 설계하기

  • 지불할 돈(1 이상 1000 미만의 정수)을 입력받는다.
  • 잔돈으로 사용할 동전 단위를 리스트에 저장한다. (500엔, 100엔, 50엔, 10엔, 5엔, 1엔)
  • 가장 큰 화폐 단위부터 차례로 거슬러 준다. 남은 금액이 현재 화폐 단위보다 작아질 때까지 반복한다.

 

➡️ 시도 회차 수정 사항 (Optional)

1회차

  • 나눗셈 연산자 /를 사용하여 소수점이 출력되는 문제를 겪었다. 동전의 개수는 정수여야 하므로, 정수 나눗셈을 사용해야 정확한 값을 얻을 수 있다.
import sys

money = int(sys.stdin.readline())
charge = 1000 - money

coins = [500, 100, 50, 10, 5, 1]
count = 0

for coin in coins:
    count += charge / coin  # 소수점 문제 발생
    charge %= coin

print(count)

2회차

  • 시간 108ms
  • 정수 나눗셈 연산자 //를 사용하여 해결하였다.
import sys

money = int(sys.stdin.readline())
charge = 1000 - money

coins = [500, 100, 50, 10, 5, 1]
count = 0

for coin in coins:
    count += charge // coin  # 정수 나눗셈으로 수정
    charge %= coin

print(count)

 

➡️ 정답 코드

import sys

money = int(sys.stdin.readline())
charge = 1000 - money

coins = [500, 100, 50, 10, 5, 1]
count = 0

for coin in coins:
    count += charge // coin
    charge %= coin

print(count)
반응형