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

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

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

투포인터 문제이다. 

 

#접근방법 

  1. start, end, sum 변수 생성 
  2. start 포인터가 end 포인터 이하일 때 동안 while문을 반복 
  3. sum값이 s값보다 이상이면 현재 길이의 최솟값 갱신

sum값이 s값보다 이상일 때 start 포인터 증가 ( sum 값 감소) 

sum값이 s값보다 미만일 때 end 포인터 증가 ( sum 값 증가) 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std; 
int main() {
	int n, s; 
	cin >> n >> s; 
	vector <int> v; 
	for (int i = 0; i < n; i++) {
		int a; cin >> a; 
		v.push_back(a);
	}
	int start = 0; 
	int end = 0;
	int sum = 0; 
	int result = 1000000; 
	while (start <= end) {
		if (sum >= s) {
			result = min(result, end - start);
			sum -= v[start++]; 
		}
		else if (end == n)break;
		else sum += v[end++]; 		
	}
	if (result == 1000000)cout << 0; 
	else cout << result; 
}

 

 

1806번: 부분합

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

www.acmicpc.net

반응형

댓글