본문 바로가기
Beakjoon&프로그래머스/Java

[백준/Java] 1535번 안녕

by 현장 2026. 1. 20.

-Code

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

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

        int cnt = Integer.parseInt(br.readLine());

        // 감소 체력 셋팅
        int[] hp = new int[cnt + 1];
        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 1; i <= cnt; i++) {
            hp[i] = Integer.parseInt(st.nextToken());
        }
        // 기쁨 셋팅
        int[] happy = new int[cnt + 1];
        st = new StringTokenizer(br.readLine());
        for (int i = 1; i <= cnt; i++) {
            happy[i] = Integer.parseInt(st.nextToken());
        }
        // dp 셋팅 (냅색 알고리즘)
        int[][] dp = new int[cnt + 1][100];
        for (int i = 1; i <= cnt; i++) {
            int disHp = hp[i];
            int incHappy = happy[i];
            for (int j = 1; j < 100 ; j++) {
                // hp가 0이면 안되므로 100 미만인 경우
                if (j >= disHp) {
                    // 이전 값에 현재 기쁨 증가 더해서 최대값 비교
                    int temp = dp[i - 1][j - disHp] + incHappy;
                    dp[i][j] = Math.max(dp[i - 1][j], temp);
                } else {
                    dp[i][j] = dp[i - 1][j];
                }
            }
        }
        System.out.println(dp[cnt][99]);
    }
}

dp인데 2개의 배열이 주어져서 뭔가 몰라 알고리즘 분류를 보니 냅색 문제였습니다. 그래서 이전에 푼 것과 비슷하게 작성했으나  두 번째 푸는 냅색 알고리즘이라 index를 잘못 입력한 것과 체력이 100 미만이 유지돼야 하는 부분을 간과하여 틀렸었습니다.