반응형
문제
10,000 이하의 자연수로 이루어진 길이 N짜리 수열이 주어진다. 이 수열에서 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.
출력
첫째 줄에 구하고자 하는 최소의 길이를 출력한다. 만일 그러한 합을 만드는 것이 불가능하다면 0을 출력하면 된다.
미만일때는 high 선증가 더하기, 이상일때는 low 후감소 빼기
low <= high 조건은 안쓰는게 좋을 것 같다. 오히려 경우의 수를 죽이는 느낌.
#include<iostream>
#include<string>
#include<vector>
#include<queue>
#include<map>
#include<algorithm>
using namespace std;
int N;
int S;
int arr[100000];
int main(void)
{
cin >> N >> S;
for (int i = 0; i < N; i++)
{
cin >> arr[i];
}
int ans = 0;
int low = 0;
int high = 0;
int sum = arr[0];
while(high < N )
{
if (sum <= S)
{
if (sum == S)
{
ans++;
}
sum += arr[++high];
}
else if (sum > S)
{
sum -= arr[low++];
}
}
cout << ans << endl;
}
반응형
'Algorithm' 카테고리의 다른 글
백준 16987번 계란으로 계란치기 (0) | 2020.08.01 |
---|---|
백준 12851번 숨바꼭질 2 (0) | 2020.08.01 |
백준 2003번 수들의 합 2 (0) | 2020.07.29 |
백준 17089번 세 친구 (0) | 2020.07.28 |
백준 2210번 숫자판 점프 (0) | 2020.07.28 |