반응형
백준 15486번 문제 - 퇴사 2
15486번: 퇴사 2
첫째 줄에 N (1 ≤ N ≤ 1,500,000)이 주어진다. 둘째 줄부터 N개의 줄에 Ti와 Pi가 공백으로 구분되어서 주어지며, 1일부터 N일까지 순서대로 주어진다. (1 ≤ Ti ≤ 50, 1 ≤ Pi ≤ 1,000)
www.acmicpc.net
문제 분석
- 퇴사를 N일 앞두고 있어, 남은 기간동안 최대로 많은 페이를 벌고 싶다.
- 스케줄이 주어졌을 때 벌 수 있는 최대 페이를 출력해라.
문제 풀이 방식
1. 일당 페이 계산 후 최대 수익 구하기
- 받은 상담 정보들의 일당페이를 계산한 후, 일당페이가 큰 값(퇴사 전에 끝나는)부터 일을 하기로 결정 !
- 하기로 결정했으면 -> 해당 수일동안은 일을 못하도록 check ArrayList의 해당 일을 true로
(check ArrayList : 이미 일이 부여된 날짜인지 확인)
--> 이 방식은 테스트 실행 결과 런타임 에러 (IllegalArgument)] 발생 ...
2. DP를 써야겠다 생각
- DP : 큰 문제를 작은문제로 나누어 푸는 문제를 일컫는 말.
- 알겠는데 해당 문제에서 어떻게 적용해야 할지 모르겠다.
해결 키 포인트
- DP 사용 문제
- [해당 작업을 했을 때, 끝나는 날에 pay] , [현재 받을 수 있는 최대 pay]+[현재 상담 pay]
중 누가 더 페이가 많은 지 확인
- [해당 작업을 했을 때, 끝나는 날에 pay] , [현재 받을 수 있는 최대 pay]+[현재 상담 pay]
- dp array 크기를 N+1 로 설정 !
- 마지막 날에 만약 T=1일 경우 일을 할 수 있기 때문에 +1까지 확인해줘야한다.
+ 해설에서 헷갈렸던 부분 !
입력 for문하고 최대값 찾는 for문을 따로 뒀다. 왜 따로뒀지?
위에 N+1까지 확인해야되서 인 것으로 판별, 그럼 그냥 입력하고 최대값 찾는 것 같이 해도 무관할 거라 판단 !
같이 해도 무관 ! 대신 마지막날 근무를 따로 한번 더 확인해줌!
코드
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());
// dp 값
int [] dp = new int[N+1];
// 최대 수익
int max = 0;
StringTokenizer st;
for (int i = 0; i < N; i++) {
// N일에 따른 상담 일정 입력
st = new StringTokenizer(br.readLine());
int t = Integer.parseInt(st.nextToken());
int p = Integer.parseInt(st.nextToken());
// max보다 현재 dp값이 클 경우 변경
if(max < dp[i])
max = dp[i];
// dp 값 설정
if (t+i < N + 1) {
dp[t+i] = Math.max(dp[t+i], max + p);
}
}
// 마지막 날도 근무 했을 수도 있으니 확인
if(max < dp[N])
max = dp[N];
System.out.println(max);
}
}
반응형
'CodingTEST' 카테고리의 다른 글
[백준 9084] 동전 (JAVA) (0) | 2023.11.09 |
---|---|
[백준 15724] 주지수 (JAVA) (0) | 2023.10.25 |
[백준 11055] 가장 큰 증가하는 부분 수열 (JAVA) (0) | 2023.10.21 |
[백준 11053] 가장 긴 증가하는 부분 수열 (JAVA) (1) | 2023.10.21 |
[백준 2212] 센서 (JAVA) (0) | 2023.10.19 |