본문 바로가기
📊알고리즘/BOJ

BOJ 1806 - 부분합

by meteorfish 2024. 4. 23.
728x90

1806번: 부분합 (acmicpc.net)

 

1806번: 부분합

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

www.acmicpc.net

접근 방법

연속된 수들 중 합이 S 이상인 것들의 길이가 최소인 것을 구하는 문제이다.

전형적인 투포인터 유형의 문제로 쉽게 해결 할 수 있다.

 

문제에서 주의할 점이 S이상 이기 때문에 이 또한 고려해야 한다.

또한, 수의 범위가 꽤 크기 때문에 자료형 선정 시도 고려해야 한다.

 

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

#define MAX 100001
#define ll long long

vector<ll> arr;
ll n, s;
ll res = MAX + 1;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> n >> s;

	for (int i = 0; i < n; i++) {
		ll tmp;
		cin >> tmp;
		arr.push_back(tmp);
	}

	ll l = 0;
	ll r = 0;
	ll tmp = 0;
	for (l = 0; l < n; l++) {
		
		
		while (r < n && tmp < s) {
			tmp += arr[r];
			r++;
		}
		if (tmp >= s) {
			res = min(res, (r - l));
		}

		tmp -= arr[l];
	}
	if (res == MAX + 1)
		cout << 0;
	else
		cout << res;
}

 

728x90

'📊알고리즘 > BOJ' 카테고리의 다른 글

BOJ 2473 - 세 용액  (0) 2024.04.23
BOJ 1644 - 소수의 연속합  (1) 2024.04.23
BOJ 2230 - 수 고르기  (0) 2024.04.22
BOJ 2143 - 두 배열의 합  (0) 2024.04.22
BOJ 3151 - 합이 0  (0) 2024.04.17