GitHubSeob

C++ / 백준 / 1644 / 소수의 연속합 본문

Baekjoon/Gold

C++ / 백준 / 1644 / 소수의 연속합

GitHubSeob 2021. 10. 7.

문제

https://www.acmicpc.net/problem/1644

 

1644번: 소수의 연속합

첫째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 4,000,000)

www.acmicpc.net

문제풀이

에라토스테네스의 체를 이용하여 N까지의 소수를 미리 구해둔다.

그 다음 두포인터 부분을 구현하면 된다.

이중 for문, while문으로 구현해봤는데 시간차이가 안났다..

1806번 문제 코드와 거의 비슷하게 구현했는데 이중for문 -> while문으로 바꿨는데 시간초과 나던코드가 통과한것으로 봐선 시간복잡도가 더 적은게 확실한데 왜 여기서는 차이가 없는지 모르겠다.

 

 

코드

#include <iostream>
#include <vector>
using namespace std;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	int N(0);
	cin >> N;

	vector<bool>prime(N + 1, true);
	int idx(0);
	int idx2(0);
	for (idx = 2; idx * idx <= N; ++idx)
		for (idx2 = idx; idx * idx2 <= N; ++idx2)
			prime[idx * idx2] = false;
		
	vector<int>seq;
	for (idx = 2; idx <= N; ++idx)
		if (prime[idx]) seq.push_back(idx);
	seq.push_back(0);

	int answer(0);

	idx = 0;
	idx2 = 0;
	int sum(0);
	while (idx2<seq.size()) {		
		if (sum >= N) {
			if(sum==N)
			++answer;
			sum -= seq[idx];
			++idx;
		}
		else {
			sum += seq[idx2];
			++idx2;
		}
	}
	cout << answer;
}

'Baekjoon > Gold' 카테고리의 다른 글

C++ / 백준 / 2632 / 피자판매  (0) 2021.10.15
C++ / 백준 / 1261 / 알고스팟  (0) 2021.10.12
C++ / 백준 / 1806 / 부분합  (0) 2021.10.07
C++ / 백준 / 1987 / 알파벳  (0) 2021.09.30
C++ / 백준 / 2580 / 스도쿠  (0) 2021.09.30