[BaekJoon] #11052 - 카드 구매하기 [Java][C++]
[BaekJoon] #11052 - 카드 구매하기 [Java][C++]
1. 아이디어
$N$개의 카드를 구매하기 위해 지불해야 하는 금액의 최댓값을 구해야 하는 문제로 다이나믹 프로그래밍을 활용하면 해결할 수 있다. i개의 카드가 들어있는 카드팩의 가격을 arr[i]로 정의하고, dp 테이블에서 dp[i]를 i개의 카드를 구매하기 위해 지불해야 하는 금액의 최댓값으로 정의할 경우 dp[i]는 모든 조합을 고려하는 arr[i], dp[1] + arr[i - 1], dp[2] + arr[i - 2], …, dp[i - 1] + arr[1] 중 최댓값이 된다.
2. 복잡도
| 접근 | 시간 | 공간 |
|---|---|---|
| 풀이 | $O(N^2)$ | $O(N)$ |
($N$ = 입력값 n)
3. 코드
풀이 [Java][C++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
int[] arr = new int[1 + n];
st = new StringTokenizer(br.readLine());
for (int i = 1; i <= n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
int[] dp = new int[1 + n];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
dp[i] = Math.max(dp[i], dp[i - j] + arr[j]);
}
}
System.out.println(dp[n]);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <bits/stdc++.h>
using namespace std;
int arr[1 + 1000];
int dp[1 + 1000];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
for (int i = 1; i <= n; i++) cin >> arr[i];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
dp[i] = max(dp[i], dp[i - j] + arr[j]);
}
}
cout << dp[n];
}
This post is licensed under CC BY 4.0 by the author.