본문 바로가기

백준 write-up/정렬 & 그리디

[백준] 거스름돈 : 14916번 - Python

728x90
반응형

https://www.acmicpc.net/problem/14916

 

14916번: 거스름돈

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

www.acmicpc.net

 

 

 

문제를 풀면서 몰랐던 개념

 

- 어떤 계산의 몫이 3이라고 하자. 그 몫에서 1을 빼주어서 2로 만들어주고 싶을 때는 나머지에 나누는 수를 더해주면 됨.

 

ex) n // 5 = 3

3 -> 2 로 취급해서 계산을 하고 싶다면,

(n % 5)에 + 5 를 해주기!

 

 

 

문제의 접근 방법

 

- 거스름돈이 1과 3일 경우에는 5와 2 모두로 나누어 떨어질 수 없기 때문에 계산 불가하다. 따라서 -1을 출력해주어야 함.

- 거스름돈이 5로 나누었을 때의 나머지가 짝수이면, 2로 나눌 수 있다는 것이므로 5로 먼저 나눠준 후(최대 횟수로) 남은 값을 2로 나눠주기.

- 거스름돈이 5로 나누었을 때의 나머지가 홀수이면, 2로 나눌 수 없다는 것이므로 5로 먼저 나눈 몫에서 1을 뺀 후, 5로 나눈 나머지에 5를 더해서 2로 나눠주기.

 

 

 

내가 막혔던 부분

 

- 5로 나누었을 때의 나머지가 홀수일 경우에 어떻게 구현해야하는지 조금 헤맸다.

 

 

 

문제 풀이 방법

 

주석 참고.

 

 

 

소스코드

n = int(input())    # 거스름돈 액수 n

tmp = n % 5 # 반복해서 나오는 식을 간단하게 변수로 선언해두기

if n == 1 or n == 3:    # 거스름돈이 1이나 3이면 거슬러줄 수 없으므로 -1 출력
    print(-1)

elif tmp % 2 == 0:  # n이 5로 나누었을 때의 나머지가 짝수이면(2로 나눌 수 있으면)
    print((n // 5) + (tmp // 2))  # 5로 나눴을 때의 몫 + 그 나머지를 2로 나눴을 때의 몫.

else:   # n이 5로 나누었을 때의 나머지가 홀수이면(2로 나눌 수 없음)
    print((n // 5) - 1 + (tmp + 5) // 2)  # 5로 나눴을 때의 몫에서 1을 빼준 값 + 그 나머지에 5를 더해준 후 2로 나눴을 때의 몫.
728x90
반응형