BaekJoon
[BaekJoon] 15486번 퇴사2 (Java) 문제 풀이 [Gold 5]
Tenacity_Dev
2024. 12. 12. 19:37
728x90
문제
https://www.acmicpc.net/problem/15486
어떻게 풀 것인가?
주어진 날짜와 수익 배열을 통해서 최대 수익을 낼 수 있는 경우를 찾으면 되는 문제였다. 해당 문제는 Bottom-up 방식으로 1일부터 차례대로 최댓값을 갱신해주도록하면서 풀었다.
1일차 (N==1)
dp[1] = 0, // 1일에 얻을 수 있는 최대 금액 (max) // 다음날 nxt = 1 + T1 = 4
dp[4] = Math.max( dp[4], dp[1] + P1) = 10 // 1일을 마치고 4일에 얻은 최대 금액 10 저장
2일차 (N==2)
dp[2] = 0, // 2일에 얻을 수 있는 최대 금액 (max) // 다음날 nxt = 2 + T2 = 7
dp[7] = Math.max( dp[7], dp[2] + 20) = 20 // 2일을 마치고 7일에 얻은 최대 금액 20 저장
...
N일차
dp[n] = 0 // 다음날 nxt = n + Tn
dp[nxt] = Math.max( dp[nxt], dp[n] + Pn)
풀면서 놓쳤던점
오랜만에 알고리즘 문제를 풀면서 처음에 다이나믹 접근법을 잊어먹었다. 그래서 처음에 푸는 시간이 굉장히 오래 걸렸다.
이 문제를 통해 얻어갈 것
다이나믹 프로그래밍(DP)
내 코드
import java.util.*;
import java.io.*;
class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
StringTokenizer st;
int[][] arr = new int[n + 2][2];
int[] dp = new int[n + 2];
for (int i = 1; i < n + 1; i++) {
st = new StringTokenizer(br.readLine());
int day = Integer.parseInt(st.nextToken());
int pay = Integer.parseInt(st.nextToken());
arr[i][0] = day; // 기간
arr[i][1] = pay; // 금액
}
int max = -1;
for (int i = 1; i <= n + 1; i++) {
if (max < dp[i]) {
max = dp[i];
}
int nxt = i + arr[i][0];
if (nxt < n + 2) {
dp[nxt] = Math.max(dp[nxt], max + arr[i][1]);
}
}
System.out.println(dp[n + 1]);
}
}
728x90