코딩테스트/백준
[백준 15486번] 퇴사2
seung_ho_choi.s
2025. 6. 7. 01:04
728x90
https://www.acmicpc.net/problem/15486
버전1
package dp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Dp15486 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] T = new int[N + 1];
int[] P = new int[N + 1];
int[] dp = new int[N + 2];
StringTokenizer st;
for(int i=1; i<N+1; i++){
st = new StringTokenizer(br.readLine());
T[i] = Integer.parseInt(st.nextToken());
P[i] = Integer.parseInt(st.nextToken());
}
int max = 0;
for (int i = 1; i < N + 1; i++) {
max = Math.max(dp[i], max); // 자기보다 앞에 큰값이 있을 경우
// 이거는 예를 들어서 1에서 4로 갈때 4가 10이고 2에서 3으로 갈떄 3이 20이라고 가정했을떄
// 1에서 4로 가는것보다 2에서 3으로가고 그다음 4로가는게 이득이다. 즉 건너띄어서 갈 수 있다.
dp[i] = max;
if (T[i] + i > N + 1) continue;
// 1일치면 그 1일치 이전 까지 즉 다시 말해서 4일치면 4일이전 즉 4일의 P[] 를 포함하는게 아님!
if (P[i] + dp[i] > dp[i + T[i]]) { // 자기보다 뒤에 큰값이 없을 경우
dp[i + T[i]] = P[i] + dp[i];
}
}
int result =0;
for(int i=1; i<=N+1; i++){
result=Math.max(dp[i], result);
}
System.out.println(result);
}
}
버전2
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringTokenizer st;
int[] T = new int[N + 1];
int[] P = new int[N + 1];
int[] dp = new int[N + 2];
for (int i = 1; i <= N; i++) {
st = new StringTokenizer(br.readLine());
T[i] = Integer.parseInt(st.nextToken());
P[i] = Integer.parseInt(st.nextToken());
}
for (int i = N; i >= 1; i--) {
int nextDay = i + T[i];
if (nextDay > N + 1) {
dp[i] = dp[i + 1]; // 일을 안했으므로 앞에 있는 값 갖고오기
} else {
dp[i] = Math.max(dp[i + 1], P[i] + dp[nextDay]); // 1. 일 안했으므로 앞에 있는 값 갖고오기, 2. 오늘 일한값, 그리고 담날에 한값들 불러오기
}
}
System.out.println(dp[1]);
}
}
버전 1 VS 버전 2 잘 보면서 DP의 기술을 잘 터득해보자
728x90