[백준] 2003 : 수들의 합 2 - Python

Chooooo·2023년 11월 23일
0

알고리즘/백준

목록 보기
133/182

문제

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

출력

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

import sys
from collections import deque

sys.stdin = open("input.txt", "rt")

# N개의 수로 된 수열
# i ~ j 번째까지의 수의 합이 M 이 되도록

n, m = map(int, input().split())
data = list(map(int, input().split()))

s,e = 0,0
interval_sum = 0 # 구간 합
cnt = 0
for s in range(n):
    while interval_sum < m and e < n:
        interval_sum += data[e]
        e += 1
    # 탈출하는 경우는 구간 합이 m 이거나 그보다 크거나
    if interval_sum == m:
        cnt += 1
    interval_sum -= data[s] # m인 경우, 그보다 큰 경우 모두 빼야함

print(cnt)

코멘트

투 포인터의 전형적인 문제. 특정한 합을 가지는 부분 연속 수열
투 포인터 유형 더 풀어봐야함.

profile
back-end, 지속 성장 가능한 개발자를 향하여

0개의 댓글