코딩테스트/백준

[Java] 백준 1912번 : 연속합

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

문제소개

 

해결과정

최초 접근은 투 포인터를 떠올렸다.

하지만, 명확하게 언제 start, end 포인터를 옮기며 판단해야하는지 떠오르지 않았다.

이후 DP를 활용해 문제를 접근하기로 했다.

 

DP를 활용한 풀이의 핵심은 현재 위치까지의 누적합이 현재 위치의 단일값과 비교했을 때 더 큰지 판단하는 것이다.

누적합이 더 크다면 해당 dp배열에 누적합을 넣어주면 되고, 단일값이 더 크다면 해당 누적합은 더 이상 최댓값을 만족하지 못하기 때문에 dp배열에 단일값을 넣어준다.

 

이렇게 구해진 dp배열 중 최댓값을 찾는다면 해당 값이 임의의 구간에서 최댓값을 의미하게 된다.

 

feat: 최근 자바 8의 스트림, 람다를 학습하고 있어 코드에 적용할 수 있다면 최대한 적용해보려고 연습하고 있습니다. 적절한 활용이 아닐 수 있다는 점 양해부탁드립니다^^.

 

솔루션

package DP.백준1912_연속합;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        List<Integer> list = Arrays.stream(br.readLine().split(" "))
                .map(w -> Integer.parseInt(w))
                .collect(Collectors.toList());

        int[] dp = new int[N + 1];
        Arrays.fill(dp, -2000);

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

        int max = Arrays.stream(dp)
                .max()
                .orElse(-1);
        System.out.println(max);

    }
}