07
23

#투포인터 활용 문제이다.

보통 합이 같을 때를 따지는데, 여기서는 크더라도 제일 근접한 합을 따진다.

#define _CRT_SECURE_NO_WARNINGS
// 1806 부분합
#include <iostream>
using namespace std;

int main() {
	int n, start = 0, end = 0;
	int a[100001];
	int s, sum = 0;
	scanf("%d %d", &n, &s);
	int min = n + 1;
	for (int i = 0; i < n; i++) scanf("%d", &a[i]);
	
	sum = a[0];
	while (start <= end && end < n) {
		if (sum < s) {
			end++;
			sum += a[end];
		}
		else if (sum == s) {
			if (end - start + 1 < min) min = end - start + 1;
			end++;
			sum += a[end];
		}
		else if (sum > s) {
			if (end - start + 1 < min) min = end - start + 1;
			sum -= a[start];
			start++;
		}
	}

	if (min > n) printf("0\n");
	else printf("%d\n", min);

	return 0;
}

 

COMMENT