2559. 누적합 (prefix sum)
https://www.acmicpc.net/problem/2559
2559번: 수열
첫째 줄에는 두 개의 정수 N과 K가 한 개의 공백을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 온도를 측정한 전체 날짜의 수이다. N은 2 이상 100,000 이하이다. 두 번째 정수 K는 합을 구하기
www.acmicpc.net
![](https://blog.kakaocdn.net/dn/bhBBu2/btsFCvTzCSk/TeBILUsm205hpclILPSHD1/img.png)
![](https://blog.kakaocdn.net/dn/ZH2cN/btsFEYAiMZj/Sol6FgJQj8fLhaCICqVh8k/img.png)
[풀이]
누적합을 이용한 풀이를 생각해내지 못하면 시간초과를 받게되는 문제이다. 나 또한 그랬다.
첫 번째 코드는 누적합 없이 푼 코드이다. → 시간초과
참고로 accumulate()는 O(N)이며 해당 코드의 시간복잡도는 O(N^2)이다.
#include <bits/stdc++.h>
using namespace std;
vector<int> input;
int N, K, in, maximum;
int main(){
ios::sync_with_stdio(0); cin.tie(0);
cin >> N >> K;
for (int i=0; i<N; i++) {
cin >> in;
input.push_back(in);
}
for (int i=0; i<N-K+1; i++){
int sum = accumulate(input.begin()+i, input.begin()+i+K, 0);
if (maximum <= sum) maximum = sum;
}
cout << maximum;
}
두 번째 코드는 누적합을 사용해 풀어본 코드이다. → 맞았습니다
#include <bits/stdc++.h>
using namespace std;
int psum[100004];
int N, K, in, maximum=-1e9;
int main(){
ios::sync_with_stdio(0); cin.tie(0);
cin >> N >> K;
for (int i=1; i<=N; i++) {
cin >> in;
psum[i] = psum[i-1] + in;
}
for (int i=K; i<=N; i++){
if (maximum <= psum[i]-psum[i-K]) maximum = psum[i]-psum[i-K];
}
cout << maximum;
}
'PS' 카테고리의 다른 글
PS (0) | 2024.03.13 |
---|---|
BOJ - 2493. 탑 (C++) (0) | 2024.03.12 |
BOJ - 9996. 한국이 그리울 땐 서버에 접속하지 (C++) (0) | 2024.03.07 |
BOJ - 3273. 두 수의 합 (C++) (0) | 2024.03.07 |
BOJ - 10988. 팰린드롬인지 확인하기 (C++) (0) | 2024.03.01 |