나는 처음에 max5와 max3을 모두 받고 모든 경우의 수를 다 따져서 가장 적은 봉지를 갖도록 코드를 짰었다. 그런데 런타임에러도 아니구 걍 실패가 떴다..
생각해보니 최대한 5kg의 봉지를 많이 이용하는 것이 가장 적은 봉지를 사용하는 것이므로 굳이 모든 경우의 수를 다 따질 필요가 없다.
코드
N = int(input())
max5 = N//5
count = -1
for i in range(max5, -1, -1):
rest = N - i*5
if rest % 3 == 0:
count = i + rest//3
break
print(count)
- 최대한 많은 5kg의 봉지를 이용하는 것이 가장 적은 봉지를 사용하는 것이라고 했다. 그래서 5kg의 봉지를 가장 많이 사용하는 경우부터 찾기 시작한다.
- 3으로 나누어 떨어지면 즉, N이 되는 나오는 순간이 가장 적은 봉지를 사용한 순간이 되므로 break를 하는 것이다.
다른 코드
N = int(input())
count = 0
while N >= 0:
if N % 5 == 0:
count += N//5
print(count)
break
N -= 3
count += 1
else:
print(-1)
- 구글링을 하면 위의 코드가 대부분이더라. 근데 첨엔 이해가 잘 안됐다..
내 코드가 더 직관적이라 좋은 듯
- 역시 최대한 많은 5kg 봉지를 사용한다.
- N이 5로 나누어질 때까지 3을 뺀다. 그리고 3kg 봉지를 사용했다는 의미이므로 count에 1을 더한다. 즉, 최대한 많은 5kg봉지를 사용하는 때를 찾는 것이다.
조심해야 할 점
- N > 0이 아닌 N >= 0이다. N=0이 다 찾았다는 의미만이 아니고, 5로 나누어지는 때를 찾을 때까지 3kg 무게를 뺀 것도 가능하기 때문이다.
while-else
- while 바깥에 else를 쓸 수 있다는 것을 새로 알게 됐다.
- while의 조건문이 거짓으로 판단되면 else문이 실행된다.
- 만약 break로 while문이 끝났다면 else는 수행되지 않는다. (else도 while문의 일부로 보고, while문을 아예 빠져나왔기 때문으로 나는 해석했다)
결론

아래가 나의 코드이다. 역시 내 코드가 더 빠르기도 하다