숫자 배열이 주어질 것이다.
이 배열에서 길이가 K인 연속된 숫자를 뽑을 것이다.
뽑는 경우의 수 중 뽑은 수의 합이 가장 커질 때의 합을 출력하는 문제이다.
sum = A[left] + A[left + 1] + ... + A[right]일 것이다.
그리고 다음 연속된 숫자 배열의 합은 아래와 같다.
sum = A[left+1] + A[left+2] + ... + A[right] + A[right+1]
두 개의 공통점과 차이점이 하나씩 존재한다.
A[left+1] ~ A[right]은 sum에 모두 포함되어 있음
이전 Search에서는 A[left]가 더해져 있지만, 현재 Search에서는 A[right+1]이 더해져 있다.
즉, index = 0 ~ K-1까지의 부분합을 구한 후, 가장 왼쪽 index(0)를 left, 가장 오른쪽 index(K-1)을 right으로 지정한다.
이후, 반복문이 한 번 수행될 때 마다 left와 right을 1씩 증가시킨다.
마지막으로, 이전 ans에 A[left-1]을 빼고, A[right]을 더해주면 끝난다.(*줄에서 1을 더했으므로)
이렇게 구한 합 중 최댓값을 답으로 저장하여 출력하면 된다.
import java.io.*;
import java.util.*;
public class Main {
static int N,K;
static int[] arr;
static void two_pointer() {
int start = 0;
int end = K-1;
int max = Integer.MIN_VALUE; // 진짜 답. 최댓값을 저장할 공간
int ans = 0; // A[0] ~ A[K-1]을 저장하는 공간
for(int i =start;i<=end;i++) {
ans+=arr[i];
}
max = ans;
while(true) {
start++;
end++;
if(end>=N) break;
ans = ans-arr[start-1]+arr[end];
// 이전 ans - arr[left-1] + arr[right] 과정
max = Math.max(ans, max);
}
System.out.println(max);
}
public static void main(String[] args) {
FastReader sc = new FastReader();
N = sc.nextInt();
K = sc.nextInt();
arr = new int[N];
for(int i =0;i<N;i++) arr[i] = sc.nextInt();
two_pointer();
}
static class FastReader // 빠른 입력을 위한 클래스
}