Baekjoon/Gold

C++ / 백준 / 1806 / 부분합

GitHubSeob 2021. 10. 7. 23:11

문제

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

 

1806번: 부분합

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

www.acmicpc.net

문제풀이

이런 식으로 sum값이 목푯값보다 작다면 sum+=arr[idx2]을 하고 idx2를 한 칸 오른쪽으로,

sum값이 목푯값 이상이라면 answer값에 answer값과 idx2-idx2+1의 값 중 더 작은 값을 저장한다.

그다음, sum-=arr[idx]을 하고 idx를 한 칸 오른쪽으로 옮긴다.

처음에 배열을 N크기가 아닌 N+1만큼 사이즈로 생성하는 이유는 idx2가 N일 때 바로 끝내면 경우의 수중 몇 개를 생략하므로 idx2가 N일 때 값이 부족하여 idx2를 +1 하는 순간 끝내도록 하기 위함이다.

 

 

코드

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	int N(0), S(0);	
	cin >> N >> S;

	int idx(0),idx2(0);	

	vector<int>seq(N + 1, 0);
	for (idx = 0; idx < N; ++idx)
		cin >> seq[idx];

	idx = 0;
	int sum(0);
	int answer(100001);

	while (idx2 < seq.size()) {
		if (sum >= S) {
			answer = min(answer, idx2 - idx);
			sum -= seq[idx];
			++idx;
		}
		else if (sum < S) {
			sum += seq[idx2];
			++idx2;
		}
	}
	if (answer == 100001) answer = 0;
	cout << answer;
}