https://www.acmicpc.net/problem/2559
"연속적인 며칠 동안의 온도의 합이 가장 큰 값 ~ ?"
=> 연속하다는 특징 이용 가능하므로, 투 포인터 사용
최초 앞에서부터 k 개의 합을 구함
2개의 포인터 ptr1
, ptr2
가 각각 [0]
, [k]
에서 시작
다음을 ptr2
가 [n-1]
을 가리킬 때까지 반복
1) 합에서 ptr1
이 가리키는 값을 빼고, ptr1++
2) 합에서 ptr2
가 가리키는 값을 더하고, ptr2++
단순하게 for 문으로 각 숫자의 위치에서, 이후 k 개의 수를 더하는 알고리즘
- O(n x k)
=> n, k 최대값 대입: 10^5 x 10^5 = 10^10 >> 1억 (시간 초과!!)
int
: 출력, k개 값의 최대 합int
가능import java.io.*;
import java.util.StringTokenizer;
public class Main {
static int n, k; // 전체 날짜 수 n, 합을 구할 연속 날짜 수 k
static int[] temperatures; // 각 날짜 별 온도
static int maxSum; // 출력
static void solution() {
// 최초 k 개 합
int temp = 0;
for (int i = 0; i < k; i++)
temp += temperatures[i];
maxSum = temp;
int ptr1 = 0; // 합에서 뺄 위치
int ptr2 = k; // 합에서 더할 위치
while (ptr2 <= n - 1) {
temp -= temperatures[ptr1++];
temp += temperatures[ptr2++];
maxSum = Math.max(maxSum, temp);
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in)
);
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
temperatures = new int[n];
for (int i = 0; i < n; i++)
temperatures[i] = Integer.parseInt(st.nextToken());
solution();
System.out.println(maxSum);
}
}