[ baekjoon ] 2839. 설탕배달

애이용·2021년 1월 10일
0

BOJ

목록 보기
16/58
post-thumbnail
post-custom-banner

2805. 설탕배달 문제 링크

문제

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

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

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

입력

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

출력

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

Dynamic Programming 문제
앞서 계산된 결과를 저장하기 위해 리스트를 초기화하고,
Bottom-up 방식으로 코드 작성

n = int(input()) # 킬로그램

d = [0] * (n + 1) # 앞서 계산된 결과 저장
d[0] = 0
# 계산되었을 때(if문 조건 만족) 인덱스 저장하자
idx = 0
for i in range(1, n + 1): # 1 ~ n
  d[i] = d[i - 1] # 먼저 앞원소의 값을 저장함
  
  # 3킬로그램 봉지 1개 추가 조건
  if (i - idx) % 3 == 0: 
    d[i] =  d[i - 1] + 1
    idx = i # 봉지가 추가된 조건이므로, 인덱스 저장
    
  # 5킬로그램 봉지 1개 추가 조건
  # (3킬로그램보다 더 적은 개수의 봉지이므로, 2번째 조건으로 - elif가 아니라 if인 이유)
  if (i - idx) % 5 == 0:
    d[i] = d[i - 1] + 1
    idx = i
    
  # i 자체가 5로 나누어질 경우(후 조건만 만족한다면 가장 적은 봉지의 개수)
  if i % 5 == 0:
    if (n - i) % 3 == 0:  # 조건 추가 # n킬로그램과 현재인덱스의 차가 3으로 나눠질 경우
      d[i] = min(d[i], i // 5) # 현재 설정된 d[i]와 i//5의 최솟값을 구한다
      idx = i
      
# idx가 for문의 마지막 i가 if문을 만족했을 때만 정확하게 n킬로그램을 만들 수 있음
if idx == n: 
  print(d[n])
else:
  print(-1)

또 다른 풀이

# 3, 5 킬로그램 봉지
n = int(input()) # 킬로그램

d = [n + 1] * (n + 1) # 앞서 계산된 결과 저장
d[0] = 0

for i in range(3, n + 1):
  # 3킬로로 할당할 수 있는 배열로 먼저 만들자
  if d[i - 3] != n + 1: # (i - 3) 킬로그램을 만드는 방법이 있는 경우
    d[i] = min(d[i], d[i - 3] + 1)

for i in range(5, n + 1):
  # 5킬로로 할당할 수 있는 배열로 업데이트
  if d[i - 5] != n + 1: # (i - 5) 킬로그램을 만드는 방법이 있는 경우 업데이트
    d[i] = min(d[i], d[i - 5] + 1)

if d[n] == n + 1:
  print(-1)
else:
  print(d[n])

차지하는 메모리는 같지만, 이 코드가 훨씬 직관적으로 이해할 수 있을 것 같다
만약 3, 5뿐만 아니라 더 다양한 킬로그램 봉지가 있다면,
for i in range(_, n + 1) 부분을 반복문으로 돌리면 된다
ex

for i in range(m): # 봉지 수 : m개라고 했을 때
	for j in range(array[i], m + 1): 
    # array[i] ~ m 까지의 킬로그램을 뜻함
    	if(j - array[i] != n + 1):
        	d[j] = min(d[j], d[j - array[i]} + 1)

ps
한방에 통과 ^~^

profile
로그를 남기자 〰️
post-custom-banner

0개의 댓글