N개의 수로 된 수열 A[1], A[2], …, A[N] 이 있다. 이 수열의 i번째 수부터 j번째 수까지의 합 A[i] + A[i+1] + … + A[j-1] + A[j]가 M이 되는 경우의 수를 구하는 프로그램을 작성하시오.
첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.
첫째 줄에 경우의 수를 출력한다.
4 2
1 1 1 1
3
10 5
1 2 3 4 2 5 3 1 1 2
3
from collections import deque
# 입력
N, M = map(int, input().split())
arr = list(map(int, input().split()))
queue = deque([]) # 부분수열
tot = 0 # 부분수열의 합
cnt = 0 # 만족하는 경우의 수
# 각 원소들을 queue에 넣어가면서 확인
for idx in range(N):
queue.append(arr[idx]) # 원소 추가
tot += queue[-1] # 부분수열 합에 더해줌
# 부분수열 합이 M보다 크거나 idx가 마지막 원소일 경우
while tot >= M or idx == N - 1:
if tot == M: # 부분수열 합이 M과 같으면
cnt += 1 # cnt 1 증가
if not queue: # queue가 비어있으면
break # while문 빠져나감
tot -= queue.popleft() # 부분수열의 맨 앞 원소 제거 및 tot에서 값 빼줌
print(cnt)