package org.example.퇴사;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.Objects;
public class Main {
public static void main(String[] args) {
try (
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
) {
int N = Integer.parseInt(br.readLine());
if (!(1 <= N && N <= 15)) {
String errorMessage = MessageFormat.format("N은 1 이상 15 이하의 정수여야 합니다. N = {0}", N);
throw new IllegalArgumentException(errorMessage);
}
Work[] works = new Work[N];
for (int i = 0; i < N; i++) {
String[] input = br.readLine()
.split(" ");
Work work = Work.of(input[0], input[1]);
works[i] = work;
}
int[] dp = new int[N + 1];
for (int i = 0; i < N; i++) {
Work todayWork = works[i];
int todayWorkEndDay = i + todayWork.getT();
int todayWorkProfit = todayWork.getP();
if (todayWorkEndDay <= N) {
dp[todayWorkEndDay] = Math.max(dp[todayWorkEndDay], dp[i] + todayWorkProfit);
}
dp[i+1] = Math.max(dp[i+1], dp[i]);
}
System.out.println(dp[N]);
} catch (Exception e) {
e.printStackTrace();
}
}
public static class Work {
private final int t;
private final int p;
public Work(int t, int p) {
if (!(1 <= t && t <= 5)) {
throw new IllegalArgumentException(MessageFormat.format("t는 1 이상 5 이하여야 합니다. t = {0}", t));
}
if (!(1 <= p && p <= 1000)) {
throw new IllegalArgumentException(MessageFormat.format("p는 1 이상 1,000 이하여야 합니다. p = {0}", p));
}
this.t = t;
this.p = p;
}
public static Work of(String otherT, String otherP) {
Objects.requireNonNull(otherT, "otherT는 null이 아니어야 합니다.");
Objects.requireNonNull(otherP, "otherP는 null이 아니어야 합니다.");
int t = Integer.parseInt(otherT);
int p = Integer.parseInt(otherP);
return new Work(t, p);
}
public int getT() {
return t;
}
public int getP() {
return p;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Work)) return false;
Work work = (Work) o;
if (t != work.t) return false;
return p == work.p;
}
@Override
public int hashCode() {
int result = t;
result = 31 * result + p;
return result;
}
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("Work{");
sb.append("t=")
.append(t);
sb.append(", p=")
.append(p);
sb.append('}');
return sb.toString();
}
}
}
- dp는 쉬운 문제더라도 감이 잘 안잡히는거 같다.
if (todayWorkEndDay <= N) {
dp[todayWorkEndDay] = Math.max(dp[todayWorkEndDay], dp[i] + todayWorkProfit);
}
- 하루씩 순회하면서
- dp[현재 상담을 받는다면 끝나는 일자] = (dp[현재 상담을 받으면 끝나는 날짜] 최대이익 , 현재 최대 이익 + 상담에 대한 이익)
- 중에 큰 값을 세팅해준다.
dp[i+1] = Math.max(dp[i+1], dp[i]);
- 다만, 놓치면 안되는 부분은 dp 배열의 이익값 자체는 전부 0 으로 초기화가 되어있기에, 다음 최대 이익은 항상 이전 최대 이익을 보장해야한다.
Uploaded by N2T
'자바 > 알고리즘' 카테고리의 다른 글
[알고리즘]병사 배치하기 (0) | 2023.09.01 |
---|---|
[알고리즘]한줄로 서기 (0) | 2023.08.31 |
[알고리즘] 바이러스 (0) | 2023.08.28 |
[알고리즘]수 찾기 (0) | 2023.08.27 |
[알고리즘]통계학 (0) | 2023.08.26 |