(C++/BOJ) 1806: 소계(포인터 2개)

https://www.acmicpc.net/problem/1806

문제

10,000보다 작거나 같은 자연수의 길이 N의 시퀀스가 ​​주어집니다. 이 수열에서 합이 S보다 크거나 같은 수열에서 가장 짧은 부분합의 길이를 구하는 프로그램을 작성하세요.

기입

첫 번째 줄은 N(10 ≤ N < 100,000) 및 S(0 < S ≤ 100,000,000)를 지정합니다. 두 번째 줄에는 시퀀스가 ​​포함되어 있습니다. 시퀀스의 각 요소는 공백으로 구분되며 10,000 미만의 자연수입니다.

누르다

첫 번째 줄에서 찾으려는 최소 길이를 인쇄하십시오. 그러한 합을 형성할 수 없으면 0을 반환합니다.


골드 4는 비교적 간단한 문제입니다.

문제를 주의 깊게 읽으십시오.

합계가 s보다 크거나 같으면 0을 반환합니다!!

내 솔루션

#include <iostream>
using namespace std;

int main(){
    int n;
    int s;
    int nums(100001)={0};
    int minlen = 100001;
    cin >> n >> s;
    for (int i = 0; i < n; ++i){
        cin >> nums(i);
    }
    int left = 0;
    int right = 0;
    int nowsum = nums(0);
    while(right < n){
        if (nowsum < s){
            right++;
            nowsum += nums(right);
        }
        if(nowsum >= s){
            if(minlen > right-left+1){
                minlen = right - left + 1;
            }
            nowsum -= nums(left);
            left++;
        }
    }
    if(minlen==100001) cout << 0;
    else cout << minlen;
    return 0;
}