백준
백준 2003번(Silver 4)
이야기prog
2023. 9. 18. 00:15
오늘 포스팅은 기초 알고리즘인 투 포인터를 이용한 간단한 백준문제를 풀어보겠습니다.
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
#include <iostream>
#include <vector>
int main() {
int N, M;
std::cin >> N >> M;
std::vector<int> tmp(N, 0);
for (auto& itr : tmp) {
int tp;
std::cin >> tp;
itr = std::move(tp);
}
int sum = 0, e = 0, s = 0, count = 0;
while (s < N) {
if (sum >= M) {
sum -= tmp[s]; s++;
}
else {
if (e < N) {
sum += tmp[e];
e++;
}
else break;
}
if (sum == M) count++;
}
std::cout << count;
return 0;
}
받는 M이 자연수이고, 수열의 값들이 자연수일 때만 가능한 알고리즘입니다.
간단히 전부 탐색한다면 O(N^2)의 복잡도를 가지지만,
이 알고리즘을 사용하면 O(N)으로 복잡도를 줄일 수 있습니다.