알고리즘 문제풀이
[백준/BOJ] 백준 1806번 : 부분합
GeniusJo
2020. 12. 29. 12:12
1806번: 부분합
첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.
www.acmicpc.net
투 포인터(두 포인터) 알고리즘을 이용해 문제를 해결한다.
코드
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n, s;
vector<int> input_data;
int main()
{
cin.tie(NULL);
ios_base::sync_with_stdio(false);
cin >> n >> s;
for (int i = 0; i < n; i++)
{
int input;
cin >> input;
input_data.push_back(input);
}
int start_point = 0;
int end_point = 0;
int sum = 0;
int result = 987654321;
//투 포인터
while (1)
{
if (sum >= s)
{
result = min(result, end_point - start_point);
sum -= input_data[start_point];
start_point++;
}
else if (end_point == n)
break;
else if (sum < s)
{
sum += input_data[end_point];
end_point++;
}
}
//합을 만드는것이 불가능할때
if (result == 987654321)
result = 0;
cout << result;
return 0;
}