PS
BOJ 2559 : 수열
lickelon
2024. 2. 24. 23:52
- 문제 링크 : boj.kr/2559
- 난이도 : S3
- 태그 : 두포인터, 슬라이딩윈도우
2559번: 수열
첫째 줄에는 두 개의 정수 N과 K가 한 개의 공백을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 온도를 측정한 전체 날짜의 수이다. N은 2 이상 100,000 이하이다. 두 번째 정수 K는 합을 구하기
www.acmicpc.net
코드
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define INF 0x7FFFFFFF
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int n, k;
cin >> n >> k;
int sum = 0;
int ans = -1e9;
vector<int> arr(n);
for(int i = 0; i < k; i++) {
cin >> arr[i];
sum += arr[i];
}
ans = max(ans, sum);
for(int i = k; i < n; i++) {
cin >> arr[i];
sum += arr[i];
sum -= arr[i-k];
ans = max(ans, sum);
}
cout << ans;
return 0;
}
풀이
$S_i$와 $S_{i+1}$의 관계에 대해서 살펴보자.
$S_i = A_{i-k} + A_{i-k+1} + \cdots + A_{i-1} + A_i$, $S_{i+1} = A_{i-k+1} + A_{i-k+2} + \cdots + A_{i} + A_{i+1}$이므로
$S_{i+1} - S_{i} = A_{i+1} - A_{i-k}$이고 $S_{i+1} = S_{i} + A_{i+1} - A_{i-k}$이다.
따라서 $S_{i}$를 통해 $S_{i+1}$을 $O(1)$로 구할 수 있고, 수열 $S$를 $O(N)$으로 구할 수 있다.
마찬가지로 수열 $S$의 최댓값을 $O(N)$으로 구할 수 있다.
728x90