popeye0618

Backend Developer

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

ko 1 조회수 시리즈 · 알고리즘 #알고리즘

실버 4 문제이며 제한 시간은 1초이다.

문제

해결 과정

이 문제는 그리디, DP 두 가지 방식으로 해결해봤다.

그리디

그리디 측면에서 생각해보면 5kg 봉지를 최대한 많이 사용하는 것이 제일 적은 개수의 봉지를 배달하는 방법이다. 따라서 3kg봉지로 하나씩 담으면서 남은 설탕의 양이 5로 나누어 떨어지면 그 양은 5kg 봉지로 담을 수 있는 최대의 양이 된다.

최종적으로 n이 0이 아니면 나누어 떨어지지 않는다는 것이므로 -1을 출력해준다.

py
n = int(input())
answer = 0

while n > 0:
  if n % 5 == 0:
    answer += n // 5
    n %= 5
    break
  n -= 3
  answer += 1

print(answer if n == 0 else -1)

DP

DP로 해결하는 방식은 현재 나의 위치에서 -3번째와 -5번째를 비교해서 더 적은 봉지를 사용한 곳에서 3kg봉지 혹은 5kg 봉지를 사용해서 담는 것이 최소한의 봉지를 사용하는 것이 된다.

dp[n]이 0이라면 나누어 떨어지지 않는 것이므로 -1을 출력해준다.

py
n = int(input())
dp = [0] * (n + 1)
dp[3] = 1

if n >= 5:
  dp[5] = 1

for i in range(5, n + 1):
  if dp[i - 3] > 0:
    if dp[i] == 0:
      dp[i] = dp[i - 3] + 1
    else:
      dp[i] = dp[i] if dp[i] < dp[i - 3] + 1 else dp[i - 3] + 1

  if dp[i - 5] > 0:
    if dp[i] == 0:
      dp[i] = dp[i - 5] + 1
    else:
      dp[i] = dp[i] if dp[i] < dp[i - 5] + 1 else dp[i - 5] + 1

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

댓글

0

아직 댓글이 없습니다.

댓글 쓰기