https://www.acmicpc.net/problem/1806
투포인터
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int N; //수열 길이
int S; //최소 합
cin >> N >> S;
vector<int> arr(N); //수열
//수열 입력받기
for (int i = 0; i < N; i++)
{
cin >> arr[i];
}
int start = 0; //부분수열의 start index
int end = 0; //부분수열의 end index
long long sum = arr[0]; //부분수열의 합
int minLen = N + 1; //부분수열의 최소 길이
// S > sum이면 e++
// S <= sum이면 minLen기록, s++
while (start <= end && end < N)
{
if (sum >= S)
{
minLen = min(minLen, end - start + 1);
sum -= arr[start];
start++;
}
else
{ // sum < S
end++;
sum += arr[end];
}
}
if (minLen > N)
{
cout << 0;
}
else
{
cout << minLen;
}
}
minLen = min(minLen, end - start + 1);
<algorithm>
라이브러리의 min함수 사용해서 아래 코드를 간단하게 줄일 수 있음if(minLen > end - start + 1) {
minLen = end - start + 1;
}
S > sum 이면
end++
arr[start] ~ arr[end+1]
이 됨S <= sum 이면
start++
arr[start+1] ~ arr[end]
이 됨start == end
(부분수열의 길이가 1)일 때 S <= sum
을 만족한다면, start++
가 수행되므로 다음번 while문 실행시 while문 조건에 위배되어 break
투포인터의 경우, for문으로 모든 경우를 돌기 보다는 while문 안에서 start와 end를 움직이는게 좀더 취지에 맞는듯..?