본문 바로가기
Programming Solve/BOJ

BOJ 2559 - 수열 / C++

by msm1029 2022. 2. 20.
반응형

문제 링크 : https://www.acmicpc.net/problem/2559

 

2559번: 수열

첫째 줄에는 두 개의 정수 N과 K가 한 개의 공백을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 온도를 측정한 전체 날짜의 수이다. N은 2 이상 100,000 이하이다. 두 번째 정수 K는 합을 구하기

www.acmicpc.net

 

 

문제 풀이

처음 생각한 방식은 포인터 2개를 이용해서 0 ~ k / 1 ~ k+1 / 2 ~ k+2 ..를 모두 더해서 최댓값을 구하려고 했다.

하지만 시간초과가 났고 포인터 2개를 더 효율적으로 쓸 수 있는 방식을 찾아보았다.

 

먼저 0 ~ k 를 더한 뒤 0번째 인덱스의 수를 빼고 k+1번째 인덱스의 수를 더하는 방식으로 풀면 시간초과가 나지 않는다.

 

 

소스 코드

시간 초과 코드

#include <iostream>
#include <vector>
using namespace std;

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);
    
    int n, k;
    vector<int> v;
    cin >> n >> k;

    for(int i=0; i<n; i++){
        int tmp;
        cin >> tmp;
        v.push_back(tmp);
    }

    int ans = 0;
    int st = 0;
    int en = k;

    for(int i=0; i<n-k; i++){
        int sum = 0;

        for(int i=st; i<en; i++){
            sum += v[i];
        }
        
        ans = max(ans, sum);
        st++;
        en++;
    }

    cout << ans;
}

 

통과 코드

#include <iostream>
#include <vector>
using namespace std;

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);
    
    int n, k;
    vector<int> v;
    cin >> n >> k;

    for(int i=0; i<n; i++){
        int tmp;
        cin >> tmp;
        v.push_back(tmp);
    }

    int sum = 0;

    for(int i=0; i<k; i++){
        sum += v[i];
    }
    
    int ans = sum;

    for(int i=0; i<n-k; i++){
        sum -= v[i];
        sum += v[i + k];

        ans = max(ans, sum);
    }

    cout << ans;
}
반응형

'Programming Solve > BOJ' 카테고리의 다른 글

BOJ 1100 - 하얀 칸 / C++  (0) 2022.02.27
BOJ 2003 - 수들의 합 2 / C++  (0) 2022.02.21
BOJ 6438 - Reverse Text / C++  (0) 2022.02.20
BOJ 2667 - 단지 번호 붙이기 / C++  (0) 2022.02.13
BOJ 1697 - 숨바꼭질 / C++  (0) 2022.02.12