728x90
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>
using namespace std;
int main() {
int N, M, k, count = 0;
vector<int>v;
cin >> N >> M;
for (int i = 0; i < N; i++) {
cin >> k;
v.push_back(k);
}
for (int i = 0; i < N; i++) {
int sum = 0;
for (int j = i; j < N; j++) {
sum += v[j];
if (sum == M) {
count++;
break;
}
if (sum > M) break;
}
}
cout << count;
return 0;
}
풀이2(투포인터, 효율이 좋음)
#include <iostream>
using namespace std;
int arr[10001];
int main() {
int N, M, end = 0, sum = 0, count = 0;
cin >> N >> M;
for (int i = 0; i < N; i++)
cin >> arr[i];
sum += arr[0];
for (int i = 0; i < N; i++) {
if (sum == M) {
count++;
sum -= arr[i];
}
else if (sum < M) {
end++;
sum += arr[end];
i--;
}
else
sum -= arr[i];
if (end == N)
break;
}
cout << count << '\n';
return 0;
}
728x90
'🥇Baekjoon Solutions > 시간복잡도' 카테고리의 다른 글
[C++] 백준 2748번: 피보나치수2 (0) | 2021.07.27 |
---|
댓글