반응형
1806번: 부분합
첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.
www.acmicpc.net
이중 for문으로 구현하면 시간 초과가 날 것이다. 투 포인터를 사용하면 O(N)의 시간복잡도로 해결할 수 있다. 투 포인터에 대한 설명은 '알고리즘' 파트에서 확인할 수 있다. 투 포인터를 이 문제로 설명하니 이해하는 데 도움이 많이 될 것이다. 링크 바로가기!
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int N, S;
cin >> N >> S;
int* ary = new int[N];
for (int i = 0; i < N; i++)
cin >> ary[i];
int start = -1, end = -1, sum = 0;
int Min = 100000;
while(end < N) {
if (sum < S) {
end++;
sum += ary[end];
continue;
}
if (sum >= S) {
Min = min(Min, end - start);
start++;
sum -= ary[start];
continue;
}
}
if (Min == 100000)
cout << 0 << endl;
else
cout << Min << endl;
delete[] ary;
return 0;
}
반응형
'알고리즘 문제풀이 > 추천 문제' 카테고리의 다른 글
[ 백준 1197 ] 최소 스패닝 트리 (C++) (0) | 2022.01.17 |
---|---|
[ 백준 1916 ] 최소비용 구하기 (0) | 2022.01.17 |
[ 백준 1700 ] 멀티탭 스케줄링 (C++) (0) | 2022.01.17 |
[ 백준 2504 ] 괄호의 값 (C++) (0) | 2022.01.17 |
[ 백준 1918 ] 후위 표기식 (C++) (0) | 2022.01.17 |