[BOJ] 백준 2003번 수들의 합 2 (Python)

deannn.Park·2021년 10월 2일
1

BOJ - 백준

목록 보기
39/42
post-thumbnail

BOJ: Q2003 - 수들의 합 2 [ 실버 3 ]

문제

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을 넘지 않는 자연수이다.

출력

첫째 줄에 경우의 수를 출력한다.

예제

입력 1

4 2
1 1 1 1

출력 1

3

입력 2

10 5
1 2 3 4 2 5 3 1 1 2

출력 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)
profile
컴퓨터 관련 여러 분야 공부중

0개의 댓글