일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
27 | 28 | 29 | 30 |
- binary search
- 3187
- 19598
- greedy
- 이진 탐색
- NCP
- Blue/Green
- 모니터링
- Lower bound
- EntityGraph
- 13975
- 14921
- DP
- Java
- slice개념
- 11501
- 20115
- Promtail
- dto projection
- 무한페이징
- 12738
- no offset
- 이분 탐색
- 2512
- 백준
- 1495
- Upper bound
- join제거
- 로그
- 그리디
- Today
- Total
멘지의 기록장
[백준] 11052 : 카드 구매하기 (JAVA) 본문
난이도
🥈 1
링크
https://www.acmicpc.net/problem/11052
11052번: 카드 구매하기
첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000)
www.acmicpc.net
문제
풀이과정
해당 문제는 DP를 사용하는 문제이다.
DP를 사용하는 전형적인 문제로, 코테에서도 종종 볼 수 있는 문제이다.
아직 알고리즘을 잘 풀지 못하기에 점화식을 찾기 굉장히 어려웠다..
하지만 생각해보면 굉장히 쉬운 문제이다.
'N개의 카드를 갖기 위해 지불해야하는 최대금액을 출력'하는 문제이기 때문에 2중 for문을 사용하여 전부 비교해보면 된다!
예를 들어 설명하자면 dp[i] = i장의 카드를 살 경우의 최대 금액이다.
dp[5]인 경우 ➡️ 5장의 카드를 살 경우의 최대 금액을 구하면 되기 때문에 아래의 값들 중 최댓값이 들어가는 것이다.
위의 예제에서 [10 9 8 7 6]의 카드 팩의 가격이 있을 때
1) 5장을 사기 위한 최대 값 + 0장 팩 값 (없음) ➡️ 6
2) 4장을 사기 위한 최대 값 + 1장 팩 값 ➡️ 50 (10+10+10+10+10+10)
3) 3장을 사기 위한 최대 값 + 2장 팩 값 ➡️ 39 (10+10+10+9)
4) 2장을 사기 위한 최대 값 + 3장 팩 값 ➡️ 28 (10+10+8)
5) 1장을 사기 위한 최대 값 + 4장 팩 값 ➡️ 17 (10+7)
최댓값인 50이 최대 금액이 되는 것을 알 수 있다.
위의 과정을 점화식으로 만든다면
dp[i] = Math.max(dp[i], card[j] + dp[i-j]가 되는 것이다.
아래의 글의 풀이과정과 유사하므로 참고하면 좋을 것 같다!
https://amepistheo.tistory.com/11
[백준] 2293 : 동전 1 (JAVA)
난이도 🥇 5 링크 https://www.acmicpc.net/problem/2293 2293번: 동전 1 첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다
amepistheo.tistory.com
전체 코드
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[] card = new int[N + 1];
int[] dp = new int[N + 1];
st = new StringTokenizer(br.readLine());
for (int i = 1; i <= N; i++) {
card[i] = Integer.parseInt(st.nextToken());
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= i; j++) {
dp[i] = Math.max(dp[i], card[j] + dp[i - j]);
}
}
System.out.println(dp[N]);
}
}
결과
'BOJ' 카테고리의 다른 글
[백준] 1026 : 보물 (JAVA) (0) | 2024.01.13 |
---|---|
[백준] 9663 : N-Queen (JAVA) (1) | 2024.01.12 |
[백준] 2293 : 동전 1 (JAVA) (1) | 2024.01.10 |
[백준] 11501 : 주식 (JAVA) (0) | 2024.01.09 |
[백준] 1946 : 신입 사원 (JAVA) (0) | 2024.01.08 |