티스토리 뷰


[BOJ 1644(G3)리뷰]

지난 문제에 이어서 푼 투 포인터 문제이다.

이 문제는 N이 최대 400만 이므로 완전탐색을 통해 풀면 시간초과가 나게 된다.

또한 소수를 판별하는 알고리즘 역시 일반적인 방법이 아닌 속도를 개선한 알고리즘을 사용해야 한다.

나는 '에라토스테네스의 체' 알고리즘을 이용하여 N까지의 소수를 선별하여 arr벡터에 담는 작업을 했다.
그 후에는 N까지의 소수가 담긴 arr벡터를 이용하여 두개의 포인터로 부분합을 만족하는 경우를 찾으면 된다.

1과 2에대한 예외처리를 하고나서 정답처리가 나왔다.

/*
	21.01.04
	BOJ : 1644 부분합 (https://www.acmicpc.net/problem/1644)
	투 포인터
*/
#include <bits/stdc++.h>
using namespace std;

bool check[4000001];

int main() {
	cin.tie(0);
	ios::sync_with_stdio(0);
	
	vector <int> arr;
	int n;
	cin >> n;

	if (n == 1) {
		cout << 0;
		return 0;
	}

	if (n == 2) {
		cout << 1;
		return 0;
	}

	int rootSqrt = sqrt(n);
	
	for (int i = 2; i <= rootSqrt; i++) {
		if (check[i]) {
			continue;
		}
		for (int j = i + i; j <= n; j += i) {
			check[j] = true;
		}
	}
	
	for (int i = 2; i <= n; i++) {
		if (!check[i])
			arr.push_back(i);
	}

	int s, e, sum, ans;
	s = e = sum = ans=0;
	int size = arr.size();
	while (e<size) {
		if (sum < n) {
			sum += arr[e++];
		}
		else {
			sum -= arr[s++];
		}

		if (sum == n) ans++;
	}
	
	if (!check[n]) ans++;

	cout << ans;
}

'알고리즘 풀이' 카테고리의 다른 글

BOJ : 12562 친구비  (0) 2021.01.24
BOJ : 2517 달리기  (0) 2021.01.13
BOJ : 14921 용액 합성하기  (0) 2021.01.09
BOJ : 1806 부분합  (0) 2021.01.04
BOJ : 14003 가장 긴 증가하는 부분 수열5  (0) 2020.08.26
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함