https://www.acmicpc.net/problem/1912
1. 아이디어
누적합 배열을 활용하면 O(N)으로 해결할 수 있다.
2. 문제풀이
N이 최대 10만이어서 O(N^2) 보다 빠른 풀이로 해결해야 했다.
다이나믹 프로그래밍의 누적합 배열을 활용하면 간단하게 해결할 수 있는데 누적합 배열을 생성한 후 누적합 배열을 순회하며 해당 인덱스 까지의 누적합과 해당 인덱스보다 작은 인덱스 범위에서 누적합의 최솟값의 차를 구하고 이러한 차의 최댓값을 구하면 연속합을 구할 수 있다.
누적합 배열을 통해 문제를 푸는 과정에서 연속합을 구할 때 인덱스가 큰 쪽에서 작은 쪽은 빼야 구간이 나온다는 점에 주의해야한다.
3. 코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
int[] prefixSum = new int[1 + N];
int min = 0;
int ans = Integer.MIN_VALUE;
for (int i = 1; i <= N; i++) {
prefixSum[i] = prefixSum[i - 1] + arr[i - 1];
min = Math.min(min, prefixSum[i - 1]);
ans = Math.max(ans, prefixSum[i] - min);
}
System.out.println(ans);
}
}
4. 후기
'코딩테스트 준비 > 백준' 카테고리의 다른 글
[백준] 12852번 - 1로 만들기 2 [Java] (0) | 2024.12.29 |
---|---|
[백준] 1463번 - 1로 만들기 [Java] (0) | 2024.12.29 |
[백준] 2441번 - 별 찍기 - 4 [Java] (1) | 2024.12.25 |
[백준] 2440번 - 별 찍기 - 3 [Java] (0) | 2024.12.25 |
[백준] 2439번 - 별 찍기 - 2 [Java] (0) | 2024.12.25 |