[C++]백준2003번 수들의 합2

less than 1 minute read

오늘은 백준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;
}