문제 포인트
누적합
해설 코드와 내 코드 비교
해설 코드는 최솟값을 고려하여 최댓값 비교
=> 최댓값을 구하라 -> 최솟값부터 최댓값 , 최솟값을 구하라 -> 최댓값부터 최솟값
해설 코드는 누적합(prefix sum)을 저장한 배열을 이용하여 구간합을 구함
=> K가 바뀔 때마다 입력값 배열을 다시 순회하여 구할 필요가 없음
내 코드는 슬라이딩 알고리즘을 이용하여 구간합을 구함
해설 코드
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, k, temp, psum[100001], ret = -1000000;
int main(){
ios_base::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;
}
내 코드 1차
개선 필요
// 연속 K개 합 중 가장 큰 값
// 슬라이딩
#include <iostream>
using namespace std;
int temper[100005];
int ret, mx;
int main(){
int n, k;
cin >> n >> k;
for(int i = 0; i < n; i++) {
cin >> temper[i];
if(i < k)
ret +=temper[i];
}
mx = ret;
for(int i = k; i < n; i++){
if(mx < ret + temper[i]-temper[i-k])
mx = ret + temper[i]-temper[i-k];
ret+=temper[i]-temper[i-k];
}
cout << mx << endl;
}
내 코드 2차
잘한점
- typedef 로 타입명 간소화
- max 라이브러리 사용하여 코드 간소화 (별도 라이브러리 import 필요 없음)
개선점
- 변수 네이밍: 구간합(Prefix sum) 배열 이름 ->psum
#include <iostream>
typedef long long ll;
using namespace std;
ll t[100005];
ll mx = -10000005;
int main(){
int n, k, temp;
cin >> n >> k;
for(int i = 1; i <= n; i++){
cin >> temp;
t[i] = t[i-1] + temp;
}
for(int i = k; i <= n; i++){
mx = max(mx, t[i] - t[i-k]);
}
cout << mx << endl;
}
'알고리즘 문제풀이' 카테고리의 다른 글
9375 패션왕 신해빈 (0) | 2023.07.05 |
---|---|
9996 한국이 그리울 땐 서버에 접속하지 (0) | 2023.07.04 |
1159 농구 경기 (0) | 2023.07.04 |
2979 트럭 주차 (0) | 2023.07.04 |