본문 바로가기
알고리즘/문제 풀이

[Java] 백준 14501 퇴사

by _eunji_ 2020. 5. 14.

https://www.acmicpc.net/problem/14501

 

14501번: 퇴사

첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다.

www.acmicpc.net

문제 설명

  • N일 동안 상담을 완료해서 받을 수 있는 최대 수익 구하기.
  • Ti = 상담하는데 걸리는 기간
  • Pi = 상담했을 때 받을 수 있는 금액
  • 상담 중인 기간에는 다른 상담을 할 수 없다.

마지막 날부터 첫째 날까지 뒤에서 앞으로 거꾸로 생각하면 더 쉽게 풀 수 있는 문제 같다.

dp [i] = i일부터 퇴사 날까지 얻을 수 있는 최대 이익이라고 하자.

 

상담일로부터 상담을 완료받기까지 걸리는 시간을 계산해 조건 (i + T [i] < N+1)을 만족시키는지 검사한다.

N+1인 이유는 상담이 걸리는 시간이 상담을 시작한 날을 포함하기 때문이다. 예를 들어, 예제 4에서 i=8일 때 T [8]=3이다. i+T [i](3+8)=11인데 사실은 10일에 끝나기 때문에 i + T [i] < N+1을 검사해주는 것이다.

1. 만약 i + T [i] > N+1이라면, 상담일이 퇴사일을 초과하는 것이기 때문에

dp [i]=dp [i+1]

2. 아니면 다음 날의 최대 이익과 당일에 상담했을 시 최대 이익을 비교하여 큰 값인

dp [i] = max(dp [i+1], dp [i+t [i]] + p [i])

 

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner s= new Scanner(System.in);
		int N = s.nextInt();
		int time[] = new int[N+1];
		int pay[] = new int[N+1];
		int dp[] = new int[N+2];
	
		for(int i=1;i<=N;i++) {
			time[i]=s.nextInt();
			pay[i]=s.nextInt();
		}
		
		for(int i=N;i>0;i--) {
			int index=i+time[i];
			
			if(index >N+1) 
				dp[i]=dp[i+1];
			else
				dp[i]=Math.max(dp[i+1],pay[i]+dp[index]);
			
		}
		
			System.out.println(dp[1]);
		
	}
}

 

주의할 점!

만약 런타임 에러가 난다면 배열 크기를 확인해볼 것!

 -> N의 크기를 받아올 때 반복문이 N부터~1까지 수행되기 때문에 dp [N+1]~dp [1]까지의 크기를 갖는 배열이 필요하므로 배열 크기는 N+2로 설정해야 한다.

 

 

처음 코드 구현을 했을 시 첫째 날부터 마지막 날까지 생각하여 점화식을 생각했는데 dp [] 배열을 활용하기 어려웠다.

뒤에서부터 거꾸로 생각할 수 있는 연습도 많이 해야겠다..

 

 

'알고리즘 > 문제 풀이' 카테고리의 다른 글

[Java] 백준 3036번 링  (0) 2020.05.16
[Java] 백준 1932번 정수 삼각형  (0) 2020.05.16
[Java] 백준 2225번 합분해  (0) 2020.05.08
[Java] 백준 2293번 동전1  (0) 2020.05.07
[Java] 백준 9461번 파도반 수열  (0) 2020.05.06

댓글