백준 15486 java : DP, 최대 가치 구하기

magicdrill·2025년 2월 4일
0

백준 문제풀이

목록 보기
543/655

백준 15486 java : DP, 최대 가치 구하기

지금까지 bufferedReader를 안쓴 이유가 귀찮아서 였는데, Scanner와 비교해서 입력시간때문에 차이가 4배 정도 나는거 보고 생각이 좀 달라진다...

DP 정리 다시...

import java.util.Arrays;
import java.util.Scanner;

public class bj15486 {
    static Scanner sc = new Scanner(System.in);
    static int [] T; // 상담을 완료하는데 걸리는 기간 T
    static int [] P; // 완료하면 받을 수 있는 금액 P
    static int N;

    public static void main(String[] args) {
        inputData();
        System.out.println(findAnswer());

        sc.close();
    }

    public static void inputData() {
        System.out.println("inputData()");
        int i, p, t;

        N = sc.nextInt();
        T = new int[N + 2];
        P = new int[N + 2];
        for(i = 1; i <= N; i++) {
            t = sc.nextInt();
            p = sc.nextInt();
            T[i] = t;
            P[i] = p;
        }
    }

    public static int findAnswer() {
        System.out.println("findAnswer()");
        int i, currentMaxIncome = Integer.MIN_VALUE, nextDay;
        //N이 7이면 8일에 퇴사하고, 7일차에 1일 걸리는 상담을 할 수 있음
        //퇴사날 최대 값을 얻어야 하니까 N이 7이면 DP[8]을 구해야 함
        int [] DP = new int[N + 2];

        for(i = 1; i <= N + 1; i++) { //1일부터 N + 1일까지 중 i일
            if(currentMaxIncome < DP[i]){//기존 저장된 값(전에 있었던 상담을 마무리해서 얻은 수익)이 i일에 저장된 수익보다 크다면?
                currentMaxIncome = DP[i];//최대 수익 갱신
            }

            nextDay = i + T[i];
            if(nextDay < N + 2){//퇴사날을 초과하지 않는다면
                //상담이 끝난 날 = max(기존 저장된 값, i일에 시작한 상담이 끝날 경우 얻는 수익 + i일까지 얻을 수 있는 최대 수익)
                DP[nextDay] = Math.max(P[i] + currentMaxIncome, DP[nextDay]);
            }

            System.out.print(i + "회차 : ");
            for(int dp : DP){
                System.out.print(dp + " ");
            }
            System.out.println();
        }

        return DP[N + 1];
    }
}

0개의 댓글