BOJ/투포인터

[C/C++] 백준 - 1806번 : 부분합

JWonK 2021. 8. 24. 17:22
728x90
반응형

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

 

1806번: 부분합

첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.

www.acmicpc.net

바로 전에 올렸었던 문제와 거의 동일한 문제이다.

투포인터로 사용하면 O(n)으로 해결이 가능하다.

#include<iostream>
#include<cmath>
#include<list>
#include<stack>
#include<tuple>
#include<map>
#include<algorithm>
#include<vector>
#include<deque>
#include<queue>
#define CUNLINK ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define endl '\n'
#define MAX_SIZE 1003
#define INF 0x7fffffff
using namespace std;
typedef long long ll;

int N;
ll M;
vector<int> arr;

int main() {
	CUNLINK;
	cin >> N >> M;
	for (int i = 0; i < N; i++) {
		int x; cin >> x;
		arr.push_back(x);
	}
	int en = 1;
	int Sum = arr[en] + arr[0];
	int answer = INF;
	for (int st = 0; st < N; st++) {
		while (en < N && Sum < M) {
			en++;
			if (en == N) break;
			Sum += arr[en];
		}
		if (en == N) break;
		//cout << st << " <-> " << en << endl;
		answer = min(answer, en - st+1);
		Sum -= arr[st];
	}
	if (answer == INF) answer = 0;
	cout << answer;
	
	return 0;
}
728x90
반응형