💻 Algorithm

[알고리즘] 백준 14916번 문제 - 거스름돈 (그리디)

date
Nov 27, 2023
slug
al-12
author
status
Public
tags
Tech
summary
type
Post
thumbnail
updatedAt
Nov 29, 2023 04:38 AM
category
💻 Algorithm
 

성능 요약

메모리: 108080 KB, 시간: 128 ms

분류

다이나믹 프로그래밍, 그리디 알고리즘, 수학

문제 설명

춘향이는 편의점 카운터에서 일한다.
손님이 2원짜리와 5원짜리로만 거스름돈을 달라고 한다. 2원짜리 동전과 5원짜리 동전은 무한정 많이 가지고 있다. 동전의 개수가 최소가 되도록 거슬러 주어야 한다. 거스름돈이 n인 경우, 최소 동전의 개수가 몇 개인지 알려주는 프로그램을 작성하시오.
예를 들어, 거스름돈이 15원이면 5원짜리 3개를, 거스름돈이 14원이면 5원짜리 2개와 2원짜리 2개로 총 4개를, 거스름돈이 13원이면 5원짜리 1개와 2원짜리 4개로 총 5개를 주어야 동전의 개수가 최소가 된다.

입력

첫째 줄에 거스름돈 액수 n(1 ≤ n ≤ 100,000)이 주어진다.

출력

거스름돈 동전의 최소 개수를 출력한다. 만약 거슬러 줄 수 없으면 -1을 출력한다.

예제 입력 1

13

예제 출력 1

5

예제 입력 2

14

예제 출력 2

4
 
언어: pypy3
링크:
import sys input = sys.stdin.readline n=int(input()) count = 0 while (n > 0): #n이 양수일때까지 if n % 5 == 0: #만약 n/5의 나머지가 0이면 # 5로 계속 나누기 count += n //5 break else: n -= 2 #만약 5로 안나눠지면 2로 뺌. count += 1 if n < 0: print(-1) else: print(count)

설명

⭐ 핵심
  • 동전의 최소의 개수를 얻으려면 가장 큰 동전인 5원짜리부터 나눠서 count를 구해간다.
  • 5원으로 나누어 떨어지면 정답에 카운트 해주고 아니면 2씩 빼주고 count에 1을 더한 뒤 다시 while문을 돌면서 정답을 구해나간다.
 
거스름돈은 2원 짜리와 5원 짜리가 존재한다.
 
그리고 이 2원과 5원이 몇 번 필요한지 구하기 위해 count를 0으로 초기화해서 생성한다.
 
숫자 n을 만드는 2원 5원의 최소 개수를 구해야 한다.
먼저, 숫자 n이 5로 나누어지는지 확인한다.
만약 5로 나누어진다면 5로 구성할 수 있는 숫자이다.
따라서 n을 5 몇 개로 만들 수 있는 지만 구해서 count 를 출력하면 된다.
 
만약 5로 나누어지지 않는다면 2원도 필요한 숫자이다.
따라서 2를 n에서 계속 빼가면서 5로 나눌 수 있는 경우를 찾아간다.
2를 빼다가 5로 나눌 수 있는 경우가 찾아지면,
반복을 멈추고 count를 출력한다.
 
만약 반복이 멈췄을때 n이 음수라면,
-1을 출력한다.