Koala - 5기/코딩테스트 준비 스터디

[BOJ / C++] 2003 : 수들의 합2

jaza 2022. 1. 31. 05:27

링크

https://www.acmicpc.net/problem/2003

 

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

 

풀이 과정

투포인터로 풀면 O(n)시간 안에 풀리는 문제이다.

다만 유의해야할점은

4 4

1 5 2 2

와 같은 예시에서 5지점에서 포인터가 역전될수도 있으므로 단순히 high>=low를 반복조건으로 두면 틀리게 된다.

따라서 포인터가 역전당했을때 다시 포인터를 옮겨주거나, 혹은 조건에서 high>=low를 제거하면 된다. 

 

코드

#include <iostream>
using namespace std;

int main()
{
	long n,m;

	int l=0;
	int arr[100000];

	cin >> n;
	cin >> m;

	int r = 0;
	for (int i = 0; i < n; i++)cin >> arr[i];

	int cnt = 0;
	int sum = arr[0];
	while (r >= l && r < n) {
		if (sum== m) {
			cnt++;
			sum += arr[++r];
		}
		else if (sum > m) {
			sum -= arr[l++];
			if (l > r) {
				r = l;
				sum = arr[r];
			}

		}
		else {
			sum += arr[++r];
		}

	}
	cout << cnt;
}