레벨업 일지

[Java] 백준 2839. 설탕 배달 본문

알고리즘/백준

[Java] 백준 2839. 설탕 배달

24시간이모자란 2023. 2. 3. 00:17

문제

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

 

2839번: 설탕 배달

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

www.acmicpc.net

알아야 할 개념

  • 다이나믹 프로그래밍

풀이

풀이는 다음과 같다. 

  1. dp 배열을 하나 만들고 최대 값 10001로 채운다. 
  2. dp 배열에 (idx == 3의 배수)를 3으로 나눈 몫으로 채운다. 
  3. dp 배열을 순회 하면서, dp[i-5] (이전에 최소값 봉지의 개수) + 1 , dp[i] (현재 개수 ) 두 값의 최솟값으로 업데이트한다.
  4. dp[ 주어진 숫자 ] 를 리턴한다. 

참고

dp[i-5] + 1 을 한 이유는 대부분의 다이나믹 프로그래밍 풀이가 그러듯이 이전에 구했던 최소 개수를 가져온다는 뜻이다. 

dp[i-5] == 이전에 구한 봉지의 개수 최솟값에  + 1 == 이번에 봉지 하나를 추가하니깐 1을 더한다. 

 

코드

자바

import java.io.*;
import java.util.*;

class Main{
    public static void main(String[] args)throws IOException{
        Main s = new Main();
        s.sol();
    }
    public void sol() throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int dp[] = new int[n+1];
        int max = 10001;
        Arrays.fill(dp,max);
        dp[3] = 1;
        
        
        for(int i = 6; i < n+1; i+=3){
            dp[i] = dp[i-3]+1;
        }
        
        for(int i = 5; i <n+1; i++){
            if(i == 5){
                dp[i] = 1;
            }else{
                dp[i] = Math.min(dp[i], dp[i-5]+1);
            }
        }
        System.out.println(dp[n] >= max ? -1 : dp[n]);
    }
}

'알고리즘 > 백준' 카테고리의 다른 글

[Java] 백준 ABCDE  (0) 2023.02.17
[Java] 백준 15686 치킨 배달  (0) 2023.02.14
[Java] 백준 18405 경쟁적 전염  (0) 2023.01.20
[Java/Python] 백준 11501 주식  (0) 2023.01.19
[Java] 백준 1700번 멀티탭 스케줄링  (0) 2023.01.19
Comments