알고리즘 문제 풀이/백준

[백준] 14501 - 퇴사 문제 풀이(자바,Java)

나맘임 2025. 6. 7. 22:00

문제

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

 

들어가며

dp 를 잘못 생각해서 못 푼 문제이다.

 

풀이 코드

package solved.ac.maraton;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class 백준14501_퇴사 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        List<int[]> cons = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            int[] s = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt)
                    .toArray();
            int t = s[0];
            int p = s[1];
            cons.add(new int[]{t,p});
        }

        int[] dp = new int[n+1];
        for (int i = 0; i < n; i++){
            int t = cons.get(i)[0];
            int p = cons.get(i)[1];

            dp[i+1] = Math.max(dp[i+1],dp[i]);
            if (i + t <= n){
                dp[i+t] = Math.max(dp[i+t],dp[i]+p);
            }
        }
        System.out.println(dp[n]);

    }
}

풀이

dp 배열엔 i 시간일 때, 최대 이익을 저장한다.

dp[i+1] = Math.max(dp[i+1],dp[i]);

먼저 다음 dp[i+1] 을 계산하기 위해 이전 값과 현재 값을 비교한다.

if (i + t <= n){
    dp[i+t] = Math.max(dp[i+t],dp[i]+p);
}

그리고 i+t 한 값이, 즉 일이 끝난 다음 시간대 계산을 하기 위해서 위와 같은 계산을 한다.

dp[i]+p 와 dp[i+t] 중에 최대값을 찾아서 갱신한다.

dp[i]는 i 시간에서 최대값을 저장하기 때문에 위와 같이 계산한다.