연속된 수들의 합을 구해야한다.
수열의 시작 인덱스 a와 마지막 인덱스 b 를 두고 합이 m이 나오면 개수를 세준다.
인덱스 a와 b는 같을 수 있다. b는 수열 길이 n 직전까지 증가한다.
계속 다른 수열합을 확인해야 하니까 a와 b 인덱스는 계속 증가한다.
단, a가 b보다 큰 인덱스가 되면 안된다. a <= b 여야 한다.
누적 합 sum이 m보다 작다면, 수열의 마지막 인덱스 b를 증가시킨다.
누적 합 sum이 m보다 크다면, 수열의 시작 인덱스 a를 증가시킨다.
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll a, b, sum, n, m, answer;
int arr[10005];
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
for(int i = 0; i < n; i++ ) cin >> arr[i];
sum = arr[a];
while(b < n && a <= b){
if(sum <= m){
if(sum == m) answer++;
sum += arr[++b];
}else { // sum > m
sum -= arr[a++];
if(a > b){
b = a;
sum = arr[a];
}
}
}
cout << answer;
return 0;
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 기타레슨 c++ (0) | 2022.06.21 |
---|---|
수열 백준 2559번 c++ (0) | 2022.05.24 |
AC 백준 5430번 c++ (0) | 2022.03.05 |
뱀과 사다리 게임 백준 16928번 c++ (0) | 2022.03.02 |
조합 백준 2407번 c++ (0) | 2022.03.02 |