https://www.acmicpc.net/problem/2003
n이 10000 이하이고, 시간 제한이 0.5초이기 때문에, n^2 풀이로 풀게 되면 시간 초과가 날 것이다.
따라서 O(n)에 해결할 수 있도록 투포인터를 사용하도록 한다.
초기에 st와 en을 모두 시작점으로 정해두고, en이 범위 밖으로 벗어날 때까지 진행해준다.
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 | #include<iostream> using namespace std; int n, m, arr[10001]; int main(void) { cin >> n >> m; for (int i = 0; i < n; i++) cin >> arr[i]; int st = 0, en = 0, cnt = 0; long long Sum = arr[0]; while (1) { //합이 부족해서 en이 우측으로 움직이는 건데, en이 밖으로 나갔다는 것은 더 볼 필요가 없다는 것 //st가 우측으로 움직여봤자 합은 더 감소하기 때문에 if (en >= n) break; if (Sum == m) { Sum += arr[++en]; //딱 만족할 때 en 증가 cnt++; } else if (Sum < m) Sum += arr[++en]; else { Sum -= arr[st++]; if (st > en) { en = st; Sum = arr[en]; } } } cout << cnt; return 0; } | cs |
'알고리즘 문제 풀이 > 백준 온라인 저지' 카테고리의 다른 글
백준 1339번: 단어 수학 (C++) (0) | 2019.08.29 |
---|---|
백준 1644번: 소수의 연속합 (C++) (0) | 2019.08.29 |
백준 13458번: 시험 감독 (C++) (0) | 2019.08.29 |
백준 14500번: 테트로미노 (C++) (0) | 2019.08.29 |
백준 14503번: 로봇 청소기 (C++) (0) | 2019.08.28 |