입력
첫째 줄에는 두 개의 정수 N과 K가 한 개의 공백을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 온도를 측정한 전체 날짜의 수이다. N은 2 이상 100,000 이하이다. 두 번째 정수 K는 합을 구하기 위한 연속적인 날짜의 수이다. K는 1과 N 사이의 정수이다. 둘째 줄에는 매일 측정한 온도를 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -100 이상 100 이하이다.
출력
첫째 줄에는 입력되는 온도의 수열에서 연속적인 K일의 온도의 합이 최대가 되는 값을 출력한다.
제출결과 시간 초과. 실패
1차 수정 : sort 를 max_element 함수를 사용해서 시간을 개선해보려 함. 실패
2차 수정 : ios_base::sync_with_stdio(false)를 넣어 속도를 개선해보려 함. 실패
3차 수정 : hap의 크기 변경. -100의 온도를 10만번 더하면 그 값은 -1천만이고 그 값을 담기에는
hap의 자료형이 int면 안되기 때문. long long 형으로 수정, 벡터 su도 마찬가지. 실패
실패 원인 분석 : 10만번의 온도 수를 10만번 이상의 경우로 뽑은것을 다시 정렬하니 연산수가 많아 시간 초과가 걸리는 것
해결 방법 : 구간합을 이용하여 연산의 개수를 줄이도록 코드를 다시 만들자
max를 통해서 최대값을 구할때는 최소값을 구하고 그것과 비교하여 큰 것으로 갱신하고, min으로 최소값을 구할때는 최대값을 구하고 그것과 비교하여 작은 것으로 갱신하는 방법을 사용하자
#include <bits/stdc++.h>
using namespace std;
int d_num;
int n;
vector<long long> su;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int r;
long long hap=0;
cin >> d_num;
cin >> n;
vector<int> inp(d_num);
for(int i=0; i<d_num; i++){
cin >> inp[i];
}
for(int i=0; i<d_num-n+1; i++){
for(int j=i; j<i+n; j++){
// cout <<"i: " <<i << " / j: "<< j << "\n";
hap += inp[j];
}
// cout << "여기까지 hap : "<< hap << "\n";
su.push_back(hap);
hap = 0;
}
long long answer = *max_element(su.begin(), su.end());
cout << answer << "\n";
// sort(su.begin(), su.end(), greater<int>());
// for(int a: su)
// cout << a << "\n";
// cout << su[0];
return 0;
}
'개발 노트 > 백준, 프로그래머스 풀이' 카테고리의 다른 글
백준 9375/c++ )) 패션왕 신해빈 (0) | 2022.06.15 |
---|---|
백준 1620/c++ )) 나는야 포켓몬 마스터 이다솜 (0) | 2022.06.15 |
[c++] 로또의 최고 순위와 최저 순위 (0) | 2022.06.15 |
백준 2559 수열 문제 개선답 (0) | 2022.06.14 |
백준 알고리즘 10988번 - 입출력, 입력범위, stirng 이해 부족으로 인한 런타임에러 (0) | 2022.06.13 |
댓글