https://www.acmicpc.net/problem/2003
Two Pointer
2개의 포인터를 조작
해가며 원하는 것을 얻는 형태의 알고리즘ex) 연속된 수들의 합, 부분 배열의 합
- 두 포인터가 같은 방향으로 진행하는 방법
전부 양수여야 함
연속하는 부분합이 특정값과 일치하는지
- 두 포인터가 다른 방향으로 진행하는 방법
정렬해야 함
두 원소의 합이 특정값과 일치하는지 (연속하지 않아도 됨)
sol)
1. start와 end포인터 0으로 초기화
2. 합이 M보다 작으면 end포인터를 이동시켜 값을 크게 해주기
3. 합이 M보다 크면 start포인터를 이동시켜 값을 작게 해주기
4. 합이 M과 같으면 count++, start포인터 이동시키기
#include <iostream>
using namespace std;
int n, m;
int a[10001];
int main() {
int cnt = 0, start = 0, end = 0, sum = 0;
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
/* 투포인터 알고리즘 */
while (end <= n) {
if (sum < m) {
sum += a[end];
end++;
}
else {
if (sum == m) cnt++;
sum -= a[start];
start++;
}
}
cout << cnt << endl;
return 0;
}