본문 바로가기
Algorithm/백준

[Python] 백준 2839번 - 설탕 배달

by 애기 개발자 2022. 10. 28.
반응형

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

 

2839번: 설탕 배달

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그

www.acmicpc.net

 

문제

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다.

상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.

상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000)

출력

상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다.

 


 마침 최근에 공부한 DP문제를 바로 적용할 수 있는 문제를 만났다.

문제를 딱 보자마자 하나하나의 경우마다 값을 더해가며 최적의 경우의 수를 찾는방식이니

 

Bottom-Up 방식의 반복문과 DP테이블을 이용한 문제풀이를 적용하면 되겠구나 싶었다.

 

import sys
n = int(sys.stdin.readline())
dp = [0]* 5001
dp[3] = 1
dp[5] = 1

for i in range(6, n+1):
  if dp[i-3] != 0:
    dp[i] = dp[i-3] + 1
  if dp[i-5] != 0:
    dp[i] = dp[i-5] + 1
  if dp[i-3] != 0 and dp[i-5] != 0:
    dp[i] = min(dp[i-3] + 1, dp[i-5] + 1)

if dp[n] == 0:
  print(-1)
else:
  print(dp[n])

문제 예제에 있는 18을 기준으로 먼저 DP테이블을 그려봤었다.

 

위와 같이 3일때와 5는 1로 고정값이니 dp[3] = d[5] = 1 로 초기화하고

 

그린 테이블을 토대로 보니 i-3 일때와 i-5일때의 값이 배수로서 값이 존재한다는것을 알게 되었다.

 

그리하여

  if dp[i-3] != 0:
    dp[i] = dp[i-3] + 1
  if dp[i-5] != 0:
    dp[i] = dp[i-5] + 1
  if dp[i-3] != 0 and dp[i-5] != 0:
    dp[i] = min(dp[i-3] + 1, dp[i-5] + 1)

위와 같은 코드를 작성하게 되었다.

 

i-3과 i-5를 각각 값에 넣으며

 

둘 다 존재할 경우 그 중 작은값을 넣는식으로

 

dp[15]의 경우를 보면

 

dp[15-3] = 4

dp[15-5] = 2

 

위와 같이 둘 다 존재하는 경우가 있다.

 

 

반응형

댓글