본문 바로가기
코딩 테스트/코딩 테스트 - 문제

[백준] 수들의 합 2

by 안스 인민군 2023. 2. 3.
 

2003번: 수들의 합 2

첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.

www.acmicpc.net

이 문제는 투포인터 같이가기의 전형적인 문제이다.

먼저 문제는 A[i] + A[i+1] + … + A[j-1] + A[j] 처럼 합을 구하는 형식이기 떄문에 같이 가야한다.

 

아래의 풀이 방식은 시작은 left만 더한 상태로 sum 의상태를 보고 미리 가르키고 있는 right를 더한 후 right를 +1 인덱스 추가 시켜주는 방식이다.

이 방식은 sum 이 m 보다 큰데 가르키고 있던 right가 n을 초과하면 더이상 없다 판단하고 종료시키는 방법이다. 

import sys

input = sys.stdin.readline

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

l = 0
r = 1
sum = arr[l]
result = 0
while True:
    if sum < m:
        if r < n:
            sum += arr[r]
            r += 1
        else:
            break
    elif sum == m:
        result += 1
        sum -= arr[l]
        l += 1
    else:
        sum -= arr[l]
        l += 1
        
print(result)