https://www.acmicpc.net/problem/1806
투포인터를 활용해주면 된다.
길이를 언제 갱신하고, 무한루프를 어느 위치에서 종료할 것인지만 명확히 해준다면 무리없이 풀리는 문제이다.
현재까지 더한 구간합이, 넘겨야할 합보다 크다면 일단 그 시점의 길이가 최소 길이인지 비교해서 갱신해준다.
이후 왼쪽 인덱스 포인터를 증가시키고 길이를 감소시키고, 변화된 상태가 조건을 만족하는지 확인해주고 이런 흐름이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #include<iostream> using namespace std; typedef long long ll; const int INF = 1000000; int main(void) { ll arr[100001]; double s; int n; cin >> n >> s; for (int i = 0; i < n; i++) cin >> arr[i]; int l = 0, h = 0, len = 0, Min = INF; ll Sum = 0; while (1) { if (Sum < s) { if (h > n - 1) break; //h가 n인데, 쿼리를 실행하게 하면 안된다 Sum += arr[h]; h++; len++; } else { if (len < Min) Min = len; Sum -= arr[l]; l++; len--; } } if (Min != INF) cout << Min << '\n'; else cout << 0 << '\n'; return 0; } | cs |
'알고리즘 문제 풀이 > 백준 온라인 저지' 카테고리의 다른 글
백준 10254 고속도로 C++ (0) | 2019.08.17 |
---|---|
백준 2458 키 순서 C++ (0) | 2019.08.16 |
백준 11404 플로이드 C++ (0) | 2019.08.16 |
백준 11657 타임머신 C++ (0) | 2019.08.16 |
백준 1753 최단경로 C++ (0) | 2019.08.15 |