알고리즘
백준_1806_부분합
shj718
2022. 5. 26. 17:30
✨문제: https://www.acmicpc.net/problem/1806
1806번: 부분합
첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.
www.acmicpc.net
✨알고리즘: 브루트포스-기타-투 포인터(Two Pointer)
✨중요 포인트: 문제조건이 '자연수'여서 이렇게 풀 수 있음.
✨코드:
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int n, s;
cin >> n >> s;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
int left = 0;
int right = 0;
int sum = a[0];
int ans = INT_MAX;
while (left <= right && right < n) {
if (sum < s) {
right++;
sum += a[right];
}
else if (sum == s) {
int cur = right - left + 1;
if (cur < ans) ans = cur;
right++;
sum += a[right];
}
else if(sum > s) {
int cur = right - left + 1;
if (cur < ans) ans = cur;
sum -= a[left];
left++;
if (left > right && left < n) {
right = left;
sum = a[left];
}
}
}
if (ans == INT_MAX) ans = 0;
cout << ans << '\n';
return 0;
}