[백준] 2839: 설탕 배달 - 파이썬[python]

다인·2024년 9월 6일

백준

목록 보기
53/112
post-thumbnail

나는 처음에 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를 쓸 수 있다는 것을 새로 알게 됐다.
  1. while의 조건문이 거짓으로 판단되면 else문이 실행된다.
  2. 만약 break로 while문이 끝났다면 else는 수행되지 않는다. (else도 while문의 일부로 보고, while문을 아예 빠져나왔기 때문으로 나는 해석했다)

결론

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

0개의 댓글