[C++]백준2003번 수들의 합2
오늘은 백준2003번 수들의 합2 문제를 풀어보도록 하자.
투 포인터를 써야하는 문제이다. 시간제한이 0.5초라 2중포문을 돌리면 TLE가 나올 것이다. 투 포인터를 써서 시간복잡도 O(N)을 만들어주는게 포인트이다.
문제는 다음과 같다.
[접근법]
1. 만일 구간 값이 M보다 크면 arr[s]값을 빼주고 s의 index값을 올려준다.
2. 만일 구간 값이 M보다 작으면 arr[e]값을 더해주고 e의 index값을 올려준다.
3. 만일 e값이 배열 끝에 도달하면 종료해준다.
[코드]
#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int arr[10000];
int N, M, s = 0, e = 0,answer = 0, sum = 0;
cin >> N >> M;
for (int i = 0; i < N; i++) {
cin >> arr[i];
}
while (1) {
if (sum >= M) {
sum -= arr[s++];
}
else if (s == N) {
break;
}
else {
sum += arr[e++];
}
if (sum == M) {
answer++;
}
}
cout << answer;
}