풀이
- 누적합과 투포인터를 이용한다.
- 왼쪽 포인터와 오른쪽 포인터를 설정하여 구간의 합을 계산한다.
- 구간의 합이 M과 같으면 경우의 수를 증가시키고 M보다 작으면 오른쪽 포인터를 증가시켜 구간을 확장하고 구간 합이 M보다 크면 왼쪽 포인터를 증가시켜 구간을 축소시킨다.
- 오른쪽 포인터가 끝에 도달할 때까지 반복한다.
- 시간복잡도 O(N)
코드
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N, M;
cin >> N >> M;
vector<int> A(N);
for (int i = 0; i < N; ++i) {
cin >> A[i];
}
int count = 0;
int left = 0;
int right = 0;
int sum = A[0];
while (right < N) {
if (sum == M) {
count++;
sum += A[++right];
} else if (sum < M) {
sum += A[++right];
} else {
sum -= A[left++];
}
}
cout << count << endl;
return 0;
}
https://www.acmicpc.net/problem/2003
'Koala - 11기 > 코딩테스트 준비 스터디' 카테고리의 다른 글
[백준/C++] 2470번 : 두 용액 (0) | 2023.07.30 |
---|---|
[백준/C++] 2473번: 세 용액 (0) | 2023.07.30 |
[백준 / Python] 1253번 : 좋다 (0) | 2023.07.30 |
[C++] 백준 15686번: 치킨 배달 (0) | 2023.07.30 |
[백준/Java] 14499 주사위 굴리기 (0) | 2023.07.30 |