두 개의 포인터를 이동시키면서 부분 배열의 합을 구한다.
부분 배열의 합을 구하는 것은 포인터가 가리키는 값의 추가, 포인터 이동에 따른 값 가감에 따라 O(1)의 시간 복잡도로 수행된다.


#include <iostream>
#include <vector>
using namespace std;
int N, M;
vector<int> A(10000);
int solution() {
int cnt = 0;
long long hap = 0;
int end = 0;
int start = 0;
hap += A[0];
while (true) {
// 현재 값을 판단
if (hap == M) {
cnt++;
end++;
if (end >= N)
break;
hap += A[end];
hap -= A[start];
start++;
}
else if (hap > M) {
hap -= A[start];
start++;
}
else { // hap < M
end++;
if (end >= N)
break;
hap += A[end];
}
}
return cnt++;
}
int main() {
cin >> N >> M;
for (int i = 0; i < N; i++) {
cin >> A[i];
}
int result = solution();
cout << result << endl;
}