[백준] 15486번: 퇴사2

ByWindow·2021년 8월 9일
0

Algorithm

목록 보기
43/104
post-thumbnail

📝문제

조금은 어려웠던 문제
현재 날짜를 기준으로 최대값을 따로 저장을 해둬야되는데 그런 과정없이 dp 배열을 사용해서 틀린 답이 나왔다.
해당 날짜를 건너뛰는 경우도 있고, 언제 일을 끝내게 될 지 모르니 최대값을 따로 저장해둬야한다.

📌코드

package Baekjoon;

import java.util.*;
import java.io.*;

public class BOJ15486 {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int[][] board = new int[2][n+2];
        for(int i = 1; i < n+1; i++){
            st = new StringTokenizer(br.readLine());
            for(int j = 0; j < 2; j++){
                board[j][i] = Integer.parseInt(st.nextToken());
            }
        }
        int[] dp = new int[n+2];
        /**
         * dp 배열에는 해당 날짜에서 받을 수 있는 금액을 적는다
         * 만약, board[_][1] = { 3, 10 }, board[_][4] = { 1, 20 } 이라면
         * dp[4]은 10, dp[5]는 10 + 20 = 30이 된다.
         */
        int curMax = 0;
        for(int i = 1; i < n+2 ; i++){
            if(curMax < dp[i]) curMax = dp[i];//최댓값 업데이트
            if(i + board[0][i] > n+1) continue; //범위 밖일 때는 스킵
            dp[i + board[0][i]] = Math.max(dp[i + board[0][i]], curMax + board[1][i]);
        }
        System.out.println(curMax);
    }
}
profile
step by step...my devlog

0개의 댓글