문제풀이/백준(Boj) 문제풀이

[백준] - 2839. 설탕 배달(python)

얄루몬 2023. 6. 6. 10:24

[dp - bottom up + dp table 문제풀이]

n = int(input())
dp = [10000] * (n+5)

dp[3] = dp[5] = 1

for now in range(6, n+1):
    dp[now] = 1 + min(dp[now-3], dp[now-5])

print(dp[n] if dp[n] < 10000 else -1)
10000 10000 1 10000 1 2 10001 2 3 2
1 2 3 / 3 4 5 6 7 8 9 10
  • 6의 경우
    • 6부터 살펴보는 이유는 간단하다 3과 5 이후의 숫자만 설탕을 나눌수 있기 때문이다. 
    • 3(6-3)의 경우엔 1개의 설탕이 저장되어 1을 더해주면 최종적으로 6kg의 설탕을 3kg 2개로 나눌 수 있게 된다.
    • 1(6-5)의 경우엔 10000이라는 수가 저장되어 1을 더해주면 최종적으로 10001이라는 수가 나와서 더 작은 수인 2가 최종적으로 6kg엔 저장되게 된다.
  • 7의 경우
    • 해당 수는 5와 3으로 나눠서 사용할 수 없기 때문에 2, 4의 10000에서 1을 더한 10001이 최소의 수여서 넘어간다.
  • 8의 경우
    • 3과 5 어떤 수가 와도 최소 2개로 옮길 수 있게 됨 이때 2를 저장 해준다.

dp와 반복문 그리고 dp table?

- dp 문제에서 반복문을 사용하면 bottom up 방식을 사용한다하고 이때 중복되는 값들을 dp table에 저장해서 중복 값은 메모리에서 불러오는 방식을 사용한다. 

- 이때 dp table은 배열(파이썬에선 리스트)을 사용해도 괜찮고 해쉬테이블(파이썬에서는 딕셔너리)를 사용해도 괜찮다.