티스토리 뷰

https://www.acmicpc.net/problem/10211

 

풀이

dp에 저장되는 값 = Math.max(이전 인덱스까지의 누적 합 - 현재 배열의 값, 현재 배열의 값)

예를 들어, 입력으로 2 1 -2 3 -5이 들어왔을 때 계산을 해보자. 참고로 계산을 편하기 하기 위해서 arr과 dp 크기를 1씩 증가시킨다.

 

arr[1]에는 2가 저장되어 있고, dp[1]에는 Math.max(dp[0] + arr[1], arr[1])을 저장한다. -> Math.max(2, 1)

arr[2]에는 1이 저장되어 있고, dp[2] = Math.max(dp[1] + arr[2], arr[2])을 저장한다. -> Math.max(3, 1)

arr[3]에는 -2가 저장되어 있고, dp[3] = Math.max(dp[2] + arr[3], arr[3])을 저장한다. -> Math.max(1, -2)

arr[4]에는 3이 저장되어 있고, dp[4] = Math.max(dp[3] + arr[4], arr[4])을 저장한다. -> Mathm.max(4, 3)

arr[5]에는 -5가 저장되어 있고, dp[5] = Math.max(dp[4] + arr[5], arr[4])을 저장한다. -> Math.max(-1, -5)

 

따라서 4번 인덱스까지의 누적 합인 4가 최대 값이다.

static int solution(int[] arr) {
    int[] dp = new int[arr.length];

    dp[0] = arr[0];
    int max = Integer.MIN_VALUE;

    for(int i = 1; i < dp.length; i++) {
        dp[i] = Math.max(arr[i], dp[i - 1] + arr[i]);
        max = Math.max(max, dp[i]);
    }

    return max;
}

 

코드

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

public class Main {

    static int T;

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

        T = Integer.parseInt(br.readLine());

        while (T-- > 0) {
            int N = Integer.parseInt(br.readLine());
            int[] arr = new int[N + 1];

            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int i = 1; i <= N; i++) {
                arr[i] = Integer.parseInt(st.nextToken());
            }

            sb.append(solution(arr) + "\n");
        }

        System.out.println(sb);
    }

    static int solution(int[] arr) {
        int[] dp = new int[arr.length];

        dp[0] = arr[0];
        int max = Integer.MIN_VALUE;

        for(int i = 1; i < dp.length; i++) {
            dp[i] = Math.max(arr[i], dp[i - 1] + arr[i]);
            max = Math.max(max, dp[i]);
        }

        return max;
    }
}
Total
Today
Yesterday
최근에 올라온 글
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30