[Silver I][JAVA] 2156번: 포도주 시식

호수·2023년 11월 28일
0

JAVA 알고리즘

목록 보기
35/67
post-thumbnail
post-custom-banner

문제링크 : https://www.acmicpc.net/problem/2156

문제설명

  1. DP를 이용하여 최댓값을 구한다.
    • 이전까지의 연속합+현재 값과 현재의 값을 비교하여, 둘 중 큰 값을 dp에 저장한다.
    • dp에 저장된 최댓값을 리턴한다.
public static void dp(int[] arrn) {
        arrn[0] = arr[0];

        max = arr[0];
        for (int i = 1; i < n; i++) {
            arrn[i] = Math.max(arr[i], arrn[i - 1] + arr[i]);
            max = Math.max(max, arrn[i]);
        }
    }
  1. 더할 때 연속으로 포도주를 마시면 안 된다는 조건이 추가된다면, 현재 위치에서의 최대값을 구할 때 고려해야 합니다. 연속으로 마시면 안 되기 때문에, i번째 위치에서의 최대값을 구할 때, i-1번째와 i-2번째 위치에서의 최대값을 활용해야 합니다.
public static void dp(int[] arrn) {
    int[] dp = new int[n + 1];
    dp[1] = arrn[1];
    dp[2] = arrn[1] + arrn[2];

    max = Math.max(dp[1], dp[2]);

    for (int i = 3; i <= n; i++) {
        dp[i] = Math.max(dp[i - 1], Math.max(dp[i - 2] + arrn[i], dp[i - 3] + arrn[i - 1] + arrn[i]));
        max = Math.max(max, dp[i]);
    }
}

에러: 런타임 에러 (ArrayIndexOutOfBounds)

n이 1이면 프로그램이 터진다.

if (n == 1) {
    System.out.println(arr[1]);
    return;
}

전체코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class boj_2156_포도주시식 {
    static int arr[];
    static int n;
    static int max;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        arr = new int[n + 1];
        for (int i = 1; i <= n; i++) {
            arr[i] = Integer.parseInt(br.readLine());
        }
        if (n == 1) {
            System.out.println(arr[1]);
            return;
        }
        dp(arr);
        System.out.println(max);
    }

    public static void dp(int[] arrn) {
        int[] dp = new int[n + 1];
        dp[1] = arrn[1];
        dp[2] = arrn[1] + arrn[2];

        max = Math.max(dp[1], dp[2]);

        for (int i = 3; i <= n; i++) {
            dp[i] = Math.max(dp[i - 1], Math.max(dp[i - 2] + arrn[i], dp[i - 3] + arrn[i - 1] + arrn[i]));
            max = Math.max(max, dp[i]);
        }
    }
}
profile
Back-End개발자 성장과정 블로그🚀
post-custom-banner

0개의 댓글