코딩테스트/백준

[Java] 백준 15486번 : 퇴사2

이덩우 2023. 12. 1. 19:36

문제소개

해결과정

총 두 번의 시도를 통해 해결했다.

DP를 활용해 풀이했으며, 첫 번째 풀이는 1일차부터 N일차까지 순서대로 해당 날짜에 총 소요되는 일 수를 더한 위치에 기존에 있던 값과 누적합을 비교해 더 큰 값으로 갱신해주는 방식으로 진행했다.

 

하지만 특정 날짜를 건너뛰고 다른 상담을 처리하는 것이 더 많은 금액을 받을 수 있다.

또한 그런 상황이라면, 해당 인덱스의 dp배열에는 기존의 값이 존재하지 않기 때문에(= 0) 잘못된 연산 결과를 얻게됐다.

 

따라서 기존의 로직에, 바로 직전 dp배열의 인덱스를 먼저 현재 인덱스의 dp배열로 받아와주는 코드를 한줄 추가해 문제를 해결했다.

솔루션

package DP.백준15486_퇴사2;

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

public class Main {

    static int N;
    static int dp[];

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

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

        for (int i = 1; i <= N; i++) {
            st = new StringTokenizer(br.readLine());
            int T = Integer.parseInt(st.nextToken());
            int P = Integer.parseInt(st.nextToken());
            try {
                dp[i] = Math.max(dp[i - 1], dp[i]);
                dp[i + T] = Math.max(dp[i + T], dp[i] + P);
            } catch (ArrayIndexOutOfBoundsException e) {}
        }
        int result = Arrays.stream(dp)
                .max()
                .orElse(0);

        System.out.println(result);

    }
}