백준/다이나믹 프로그래밍

[백준🥈4] #2839 설탕배달 (python)

똥먹는낙타 2022. 12. 1. 17:24
728x90
반응형

문제

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

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

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

입력

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

출력

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

예제 입력 1

18

예제 출력 1

4

예제 입력 2

4

예제 출력 2

-1

예제 입력 3

6

예제 출력 3

2

예제 입력 4

9

예제 출력 4

3

예제 입력 5

11

예제 출력 5

3

 

✔️ Code

n = int(input())

dp = [5001] * (n+5)
dp[3] = dp[5] = 1

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

if dp[n] < 5001:
    print(dp[n])

else:
    print(-1)

 

✏️ Comment

전에 그리디 알고리즘으로 푼 적이 있는 문제인데, DP 카테고리에도 있길래 풀어보았다.

우선 dp 배열을 입력으로 들어오는 N의 최댓값보다 큰 5001로 초기화하여 (N+5) 개 생성해준다. 처음에 (N+1)개로 했다가 백준 제출했을 때 런타임에러(인덱스에러)가 떠서 찾아보니까 N의 값이 5보다 작은 경우 인덱스에러가 발생하는 게 원인이었다. 

다음으로 순서대로 for문을 돌면서 dp배열 값을 바꾼다. 이때, 설탕 3kg과 5kg으로 만들어지는 kg이 주어진다면 해당 무게에 각각 -3, -5일 때의 값의 최솟값에 +1 해주는 식으로 채워나가면 된다.

만약에 3kg과 5kg으로 만들어지지 않는 무게라면, 해당 dp[n]의 값은 5002일 것이다. 따라서 마지막 조건문에서 dp[n]의 값이 5001보다 작다면 dp[n] 출력, 아니라면 -1을 출력해주면 된다. (만약에 여기서 조건문을 dp[n] != 5001로 하게 되면 5002가 출력될 수 있으므로 dp[n] < 5001 로 조건을 달아줘야 한다.)

728x90
반응형