https://www.acmicpc.net/problem/2003
2003번: 수들의 합 2
첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.
www.acmicpc.net
풀이 과정
i번째 수부터 j번째 수까지의 합 A[i] + A[i+1] + … + A[j-1] + A[j]가 M이 되는 경우의 수를 구하면 된다.
for문 중첩시키고 모든 연속구간을 만들어 보는 방법으로는 시간제한 내로 문제를 해결할 수 없다. 간단하게만 생각해봐도 N이 만까지 들어오는데 O(N^2) 알고리즘만 되도 TLE가 날 가능성이 있다. 투 포인터 알고리즘을 사용하면 O(N)으로 해결할 수 있다.
l, h 두 개의 포인터를 조절해가며 문제를 해결하였다.
소스 코드
#include <iostream>
#include <vector>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int N, M, sum, number, answer, l, h;
sum = 0; l = 0; h = 0; answer = 0;
vector<int> vec(N);
cin >> N >> M;
for (int i = 0; i < N; i++) {
cin >> vec[i];
}
while(true) {
if (sum >= M) {
sum -= vec[l++];
} else if (h == N) {
break;
} else {
sum += vec[h++];
}
if (sum == M) {
answer++;
}
}
cout << answer;
return 0;
}
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
백준 2748 - 피보나치 수 2 [C++] (0) | 2022.07.05 |
---|---|
백준 2805 - 나무 자르기 [C++] (0) | 2022.07.05 |
백준 1260 - DFS와 BFS [파이썬] (0) | 2022.06.27 |
백준 2309 - 일곱 난쟁이 [파이썬] (0) | 2022.05.26 |
백준 2133 - 타일 채우기 [파이썬] (0) | 2022.05.26 |