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)$으로 구할 수 있다.

'PS' 카테고리의 다른 글

BOJ 1520 : 내리막 길  (1) 2024.02.26
BOJ 1788 : 피보나치 수의 확장  (1) 2024.02.25
BOJ 31421 : 호떡 뒤집기  (0) 2024.02.23
BOJ 31418 : 스펀지  (0) 2024.02.22
BOJ 31423 : 신촌 통폐합 계획  (0) 2024.02.21