이중포문을 사용하면 쉽게 풀릴 것 같지만 n의 최대값이 100000이라 시간초과가 무조건 발생한다.
이중포문을 사용하면 O(N^2)의 시간복잡도가 발생하지만
투 포인터스 알고리즘(Two Pointers Algorithm)을 사용하면 O(N)으로 줄일 수 있다.
코드
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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | #include<iostream> #include<stdio.h> #include<vector> #include<algorithm> using namespace std; int arr[100000]; int main() { //freopen("Text.txt", "r", stdin); int n, m; cin >> n >> m; for (int i = 0; i < n; i++) { cin >> arr[i]; } int ans = 2000000000; int len = 0; int left = 0; int right = 0; int sum = arr[0]; while (left <= right && right < n) { if (sum < m) { if (right < n) { right += 1; sum += arr[right]; } } else if (sum >= m) { len = right - left + 1; if (ans > len) { ans = len; } if (left <= right) { sum -= arr[left]; left++; } } } if (ans == 2000000000) { cout << 0; } else { cout << ans; } } | cs |
'BOJ' 카테고리의 다른 글
백준 1208 / 부분집합의 합 2 (0) | 2019.01.30 |
---|---|
백준 1644 / 소수의 연속합 (0) | 2019.01.30 |
백준 12100 / 2048 (Easy) (0) | 2019.01.29 |
백준 1062 / 가르침 (0) | 2019.01.25 |
백준 14391 / 종이 조각 (0) | 2019.01.24 |