백준/증가수열 & 투포인터

[백준 2003번 / C++ / 투포인터] 수들의 합2

배발자 2022. 2. 16.
반응형

투포인터를 활용한 문제이다. 

 

1. s, e 포인터를 생성하여 벡터의 첫번째 원소를 가리킨다. 

2. e 포인터가 벡터의 사이즈보다 작을때 동안 반복문을 돌린다. 

3. 만약 sum값이 m보다 작다면 s포인터가 가리키고 있는 원소의 값을 sum값에 빼주면서 포인터의 위치를 하나 증가

4. sum값이 m가 같다면 result 값 증가 

5. s 포인터가 증가 시켜야하는 조건문에 부합되지 않으면 continue에 걸리지 않는다. 그러므로 end 포인터를 증가시켜야하는 코드부분에 도달하게 된다.  여기서 주의할 점은  증가된 e포인터가 원소의 값을 갖고 있을때만 sum에 더해준다. 

#include <iostream>
#include <vector>
using namespace std; 
int main() {
	int n, m; cin >> n >> m; 
	vector <int> v(n, 0); 
	for (int i = 0; i < n; i++)cin >> v[i]; 
	int s, e, sum; 
	s = e = 0; 
	sum = v[s]; 
	int result = 0; 
	while (e<v.size()) {
		if (sum > m) {
			sum -= v[s++]; 
			continue; 
		}
		if (sum == m)result++;
		if (e < v.size() - 1) {
			sum += v[++e];
		}
		else e++;			
	}
	cout << result; 
}

end

 

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

반응형

댓글