반응형

[Silver IV] 수들의 합 2 - 2003

문제 링크

성능 요약

메모리: 30840 KB, 시간: 584 ms

분류

두 포인터(two_pointer)

문제 설명

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

출력

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

N, M = map(int,input().split())
array = list(map(int,input().split()))
left,right = 0,1
cnt = 0
while right <= N and left <= right:
    sum_array = array[left:right]
    answer = sum(sum_array)
    if answer == M:
        cnt += 1
        right += 1
    elif answer < M:
        right += 1
    else:
        left += 1
print(cnt)

left번째 숫자부터 right번째 숫자까지. 투 포인터로 해결할 수 있는 문제.

1.left~right번째 숫자의 합이 같거나 작으면 right번째 숫자를 계속 1씩 늘려준다.

2.작아지면 left번째 숫자를 1씩 늘려준다.

3.총 같았던 횟수 cnt 출력

+ Recent posts