[백준] 2003 수 들의 합2

0

백준

목록 보기
27/271
post-thumbnail

백준 2003 수 들의 합2

부분합 알고리즘 풀이

#include <iostream>
using namespace std;

typedef unsigned long int ul;
const int MAXN = 10000 + 1;

int N;
ul M;
int A[MAXN];
ul psum[MAXN];

void getpsum() {
	psum[0] = 0;
	for (int i = 1; i <= N; ++i)
		psum[i] = psum[i - 1] + A[i];
	return;
}

ul getCnt() {
	ul ret = 0;
	for (int i = 1; i <= N; ++i)
		for (int j = i; j <= N; ++j)
			if (psum[j] - psum[i - 1] == M)
				++ret;
	return ret;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> N >> M;
	for (int i = 1; i <= N; ++i)
		cin >> A[i];

	getpsum();
	cout << getCnt();
	return 0;
}

⚡투 포인터 알고리즘 풀이

  • psum = A[start]부터 A[end - 1]까지의 부분 합
#include <iostream>
using namespace std;

typedef unsigned long int ul;
const int MAXN = 10000 + 1;

int N;
ul M;
int A[MAXN] = { 0 };

ul getCnt() {
	ul ret = 0;
	int start = 0;
	int end = 0;
	ul psum = 0;

	while (end <= N) {
		if (psum >= M)
			psum -= A[start++];
		else if (psum < M)
			psum += A[end++];

		if (psum == M)
			ret++;
	}

	return ret;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> N >> M;
	for (int i = 0; i < N; ++i)
		cin >> A[i];

	cout << getCnt();
	return 0;
}
profile
Be able to be vulnerable, in search of truth

0개의 댓글