알고리즘 모음(C++)

백준 1806 - 부분합(C++) 본문

백준

백준 1806 - 부분합(C++)

공대생의 잡다한 사전 2021. 11. 2. 23:50

문제 링크입니다https://www.acmicpc.net/problem/1806

 

1806번: 부분합

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

www.acmicpc.net

기본적인 두 포인터 알고리즘 문제였습니다.

문제 조건
출력 예시

 

S이상 합을 가질 수 있는 수열의 길이를 구하는 문제였습니다.

low 와 high를 정한뒤, low ~ high까지 vector의 합을 구한 다음, S와 비교한 뒤, 값에 따라 low 와 high를 증가하면 됩니다.

 

 

자세한 것은 코드를 참고해주세요!

 

#define _CRT_SECURE_NO_WARNINGS
#include <cstring>
#include <vector>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstdio>
#include <string>
#include <deque>

using namespace std;

int N;
int S;
int ans = 100001;
vector<int> number;

void solve() {
	int low = 0;
	int high = 0;
	int sum = number[0];
	while (low <= high && high < number.size()) {
		if (sum < S) {
			if (high < number.size() - 1) {
				high++;
				sum += number[high];
			}
			else break;
		}
		else if (sum == S) {
			ans = min(ans, high - low + 1);
			sum -= number[low];
			low++;		
		}
		else {
			ans = min(ans, high - low + 1);
			sum -= number[low];
			low++;
		}
	}
	if (ans == 100001) {
		cout << "0";
	}
	else cout << ans;
}

int main() {
	cin.tie(0);
	cout.tie(0);
	cin >> N >> S;
	for (int i = 0; i < N; i++) {
		int num;
		cin >> num;
		number.push_back(num);
	}
	solve();
	return 0;
}

 

질문 및 조언 댓글 남겨주세요!

'백준' 카테고리의 다른 글

백준 10866 - 덱(C++)  (0) 2021.11.03
백준 10816 - 숫자 카드2(C++)  (0) 2021.11.03
백준 1644 - 소수의 연속합(C++)  (0) 2021.11.02
백준 12100 - 2048(Easy) (C++, 복습)  (0) 2021.11.02
백준 11049 - 행렬 곱셈 순서(C++)  (3) 2021.10.28