728x90
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 |