✨ 알고리즘 분류 : 다이나믹프로그래밍
https://www.acmicpc.net/problem/16194
16194번: 카드 구매하기 2
첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000)
www.acmicpc.net
🪡 문제에서 요구하는 조건 정리
- 카드를 사기 위해 지불해야 하는 금액 중 제일 적은 값 출력
- 카드 개수의 합 = n
🧶 풀이과정
저번에 최대값을 구하는 것의 반대로, 최솟값을 구하는 것이다.
2024.04.16 - [Algorithm] - [059] 11052. 카드 구매하기
[059] 11052. 카드 구매하기
✨ 알고리즘 분류 : 다이나믹 프로그래밍 https://www.acmicpc.net/problem/11052 11052번: 카드 구매하기 첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부
jee-jeee.tistory.com
여기에서 조금 다른 점은, Max가 아니라 Min을 통해 최솟값을 구한다는 점과
처음 최솟값을 구하기 위해서 미리 dp[i]에 값을 대입해야 한다는 것이다.
비교하기 위한 값 중에 일정한 값은 무엇이 있을까? 그건 pack[i]이기 때문에 초기 값을 설정하고, min으로 비교를 수행하며 넣는 것으로 한다.
🏹 제출코드
package data_structure_part_01;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Q16194 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] pack = new int[n+1];
int[] dp = new int[n+1];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i = 1; i <= n ; i++){
int card = Integer.parseInt(st.nextToken());
pack[i] = card;
dp[i] = pack[i];
for(int j = 1; j <= i ; j++){
dp[i] = Math.min(dp[i], dp[i-j] + pack[j]);
}
}
System.out.println(dp[n]);
br.close();
}
}
'Algorithm' 카테고리의 다른 글
[062] 10844. 쉬운 계단 수 (0) | 2024.04.18 |
---|---|
[061] 15990. 1, 2, 3 더하기 5 (1) | 2024.04.17 |
[059] 11052. 카드 구매하기 (0) | 2024.04.16 |
[058] 9095. 1,2,3 더하기 (1) | 2024.04.12 |
[057] 11727. 2xn 타일링 2 (0) | 2024.04.12 |