본문 바로가기
🥇Baekjoon Solutions/시간복잡도

[C++] 백준 2003번: 수들의 합2

by 코푸는 개발자 2021. 7. 27.
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

댓글