# 본인 풀이
#include <bits/stdc++.h>
using namespace std;
int n, k;
int cel[100000];
int psum[100001];
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> k;
for (int i = 0; i < n; i++){
cin >> cel[i];
psum[i] = psum[i - 1] + cel[i];
}
int max = -INFINITY;
for (int i = k - 1; i < n; i++){
if(max < psum[i] - psum[i-k]){
max = psum[i] - psum[i - k];
}
}
cout << max << "\n";
return 0;
}
- 초기에는 psum 누적합 배열을 사용하지 않고 매번 For문에서 누적합 계산 후 push하는 형태로 구현했는데, 시간복잡도 O(n^2)으로 시간초과가 발생하였음.
- 누적합으로 로직 개선 후 O(n)으로 시간복잡도가 개선되었고 정답처리되었음.
# 개선 코드
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, k, temp, psum[100001], ret = -10000004;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> k;
for (int i = 1; i <= n; i++)
{
cin >> temp;
psum[i] = psum[i - 1] + temp;
}
for (int i = k; i <= n; i++){
ret = max(ret, psum[i] - psum[i - k]);
}
cout << ret << "\n";
return 0;
}
- 딱히 개선이랄것은 없었음
- ret - 최대 최소 범위 설정에 대한 로직이 살짝 달랐는데, INFINITY 상수를 사용해도 상관없지만 타입에 따라 그 값이 달라질 수 있기 때문에 명확하게는 범위에 따라 설정해주는 것이 좋을 수 있다. (굳이 안해도 될듯)