/* 문제설명 */
상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다.
상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.
상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000)
출력
상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다.
/* 풀이방법 */
동적계획법 기법중 메모이제이션 기법을 사용했다.
처음에 N크기만한 배열을 생성하고 -1로 초기화 했다.
그리고 설탕의 최소 크기인 3과 5 를 1로 초기화 한다 --->이때 배열의 범위에 유의해라!
그리고 그 이후 목적지(d[N])까지 반복문을 통해 이동하는데,
이때 d[i-3]이나 d[i-5]가 -1이 아니라면 해당 위치 +1이 가장 최소값이 된다.
왜냐하면, d[i-3]에는 i-3까지 도착하는 최소값이 기록되어 있으므로 거기에 설탕 3kg하나 더하는 것이다.
d[i-3]과 d[i-5], 둘 다 -1이라면 당연히 현재위치도 -1이 된다.
이러한 방식으로 동적계획법을 구현했다.
/* 해답코드 */
package baekjoon;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
//설탕배달
//dp의 기본
public class b2839 {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] d = new int[N+1];
for(int i=0;i<=N;i++) {
d[i]=-1;
}
if(N>=3)
d[3] = 1;
if(N>=5)
d[5] = 1;
for(int i=6;i<=N;i++) {
if(d[i-3]==-1&&d[i-5]==-1)
continue;
else if(d[i-3]==-1)
d[i]=d[i-5]+1;
else if(d[i-5]==-1)
d[i]=d[i-3]+1;
else
d[i]=Math.min(d[i-3]+1, d[i-5]+1);
}
System.out.println(d[N]);
}
}
'Coding Test > Baekjoon' 카테고리의 다른 글
[백준]선물 전달 (0) | 2021.08.16 |
---|---|
[백준]1,2,3 더하기 (0) | 2021.08.14 |
[백준]개미 (0) | 2021.08.08 |
[백준]경비원 (0) | 2021.08.07 |
[백준]색종이 (0) | 2021.08.07 |