문제
10,000 이하의 자연수로 이루어진 길이 N짜리 수열이 주어진다. 이 수열에서 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.
출력
첫째 줄에 구하고자 하는 최소의 길이를 출력한다. 만일 그러한 합을 만드는 것이 불가능하다면 0을 출력하면 된다.
구현부를 깔끔하게 하는 것과,
p2의 범위 초과 문제가 있었는데 인풋 벡터를 한 칸 늘려줘서 해결했다.
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int p1 = 0;
int p2 = 0;
int minD = INT_MAX;
int sum = 0;
int N, S;
cin >> N >> S;
// 범위 문제에서 자유롭기 위해 한 칸 여유롭게 잡아주었다.
vector<int> vInput(N + 1);
for (int i = 0; i < N; i++)
{
cin >> vInput[i];
}
sum = vInput[p1];
while (p1 <= p2 && p2 < N)
{
if (sum < S)
{
p2++;
sum += vInput[p2];
}
else
{
minD = min(minD, p2 - p1 + 1);
// p1을 오른쪽으로 한칸 옮기면서 합에서 빼준다.
sum -= vInput[p1];
p1++;
}
}
if (minD == INT_MAX)
{
cout << 0;
}
else
{
cout << minD;
}
return 0;
}