코딩테스트/백준

[백준]14501번 퇴사 - Java

GAEBAL 2022. 4. 5. 23:58
728x90

문제

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

 

14501번: 퇴사

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

www.acmicpc.net

 

 

풀이

DP 문제임. 1차원 정답 배열(dp)를 만들어서 풀었음

하루가 지날 때마다 최댓값을 dp 배열에 갱신해주는게 포인트 !

아직 헷갈려서 담에 한번 더 풀어봐야겠음

 

T, P, dp 배열을 N+6으로 크기를 설정해준 이유는 [맨처음 0번 인덱스 + (1 ≤ Ti ≤ 5)] 이거 때문이다.

 

 

코드

// 14501번 퇴사
// https://www.acmicpc.net/problem/14501

package BAEKJOON;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Num14501_퇴사 {
    static int N;
    static int[] T;
    static int[] P;
    static int[] dp;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        N = Integer.parseInt(br.readLine());
        T = new int[N + 6];
        P = new int[N + 6];
        dp = new int[N + 6];

        StringTokenizer st;
        for (int i = 1; i <= N; i++) {
            st = new StringTokenizer(br.readLine());

            T[i] = Integer.parseInt(st.nextToken());
            P[i] = Integer.parseInt(st.nextToken());
        }

        int max = Integer.MIN_VALUE;

        for (int i = 1; i <= N + 1; i++) {
            // 하루가 지날 때마다 dp배열 갱신
            dp[i] = Math.max(dp[i], max);

            // 정답 배열(dp)에는 해당 날짜에 받을 수 있는 최대 이익을 저장
            dp[i + T[i]] = Math.max(dp[i + T[i]], P[i] + dp[i]);

            max = Math.max(max, dp[i]);
//            System.out.println("i = " + i);
//            System.out.println("max = " + max);
//            System.out.println(Arrays.toString(dp));
//            System.out.println();
        }

        System.out.println(dp[N + 1]);
    }
}
728x90