반응형
문제 출처 :
https://www.acmicpc.net/problem/1806
알고리즘 분석 :
문제 해결에 필요한 사항
1. Prefix Sum :: http://www.crocus.co.kr/259
2. 투 포인터
Prefix Sum에 대한 개념을 알고(부분 합, 구간 합)이를 이용하여 투 포인터로 문제를 해결하면 간단히 해결되는 문제이다.
pSum의 의미는 고등학교 시절에 배우는 수열의 합 부분에서 S를 의미한다.
즉, S[3] = a1 + a2 + a3를 의미하고 S[10] = a1 + a2 + ... + a9 + a10을 의미하며
S[10] - S[3]은 a4 + a5 + a6 + a7 + a8 + a9인 4~9사이의 부분합을 나타내어준다.
소스 코드 :
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 58 59 60 61 62 63 | #include <iostream> #include <cstdio> #include <algorithm> #define MAX_N 100001 using namespace std; int arr[MAX_N]; int pSum[MAX_N]; int main() { int n, s, minLen = MAX_N, len = 0; int p1 = 1, p2 = 1; scanf("%d %d", &n, &s); // pSum은 구간 1~i까지의 합을 나타내준다. for (int i = 1; i <= n; i++) { scanf("%d", &arr[i]); pSum[i] = pSum[i - 1] + arr[i]; } // p1과 p2가 같고, p1이 n에 도달한 경우가 아닌 경우에 while while (!(n == p1 && p1 == p2)) { // p1~p2까지의 합이 s보다 크거나 같으면 if (pSum[p2] - pSum[p1-1] >= s) { // 길이를 구해주고 최소 길이를 구해준다. len = p2 - p1 + 1; if (minLen > len) minLen = len; p1++; } // p1~p2까지의 합이 s보다 작으면 else if (pSum[p2] - pSum[p1 - 1] < s) { // p2가 아직 끝지점에 도달하지 않았다면 p2++를, // 그 외에는 p1++를 한다. if (p2 < n) p2++; else p1++; } } // 정답 출력 if (minLen == MAX_N) cout << "0"; else cout << minLen; return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
반응형
'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
[2096번] 내려가기 (0) | 2017.02.14 |
---|---|
[1644번] 소수의 연속합 (0) | 2017.02.14 |
[2581번] 소수 (0) | 2017.02.13 |
[11377번] 열혈강호 3 (4) | 2017.02.10 |
[11376번] 열혈강호 2 (0) | 2017.02.10 |