코딩테스트/python
백준_1644_소수의 연속합
zyin
2022. 3. 4. 17:19
문제
https://www.acmicpc.net/problem/1644
1644번: 소수의 연속합
첫째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 4,000,000)
www.acmicpc.net
풀이
2부터 N까지의 소수를 구하고, Two Pointer 을 이용해서, 합이 N이 되는 경우를 찾는다.
1) 에라토스테네스의 체
에라토스테네스의 체 - 위키백과, 우리 모두의 백과사전
수학에서 에라토스테네스의 체는 소수를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견하였다. 알고리즘[편집] 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서
ko.wikipedia.org
2) 투 포인터
시작 인덱스와 끝 인덱스를 옮겨가면서, 누적합을 구한다.
코드
N = int(input())
# Get Prime
primes = list()
numBoard = [1, ]*(N+1)
primeList = list()
for factor in range(2, len(numBoard)) :
if numBoard[factor] == 0 : continue
for i in range(2*factor, len(numBoard), factor) :
numBoard[i] = 0
for factor in range(2, len(numBoard)) :
if numBoard[factor] == 1 :
primeList.append(factor)
# Get Sum - two pointer
s, e, ans = 0, 1, 0
if primeList :
accumulate = primeList[s]
while s<e :
if accumulate==N :
ans += 1
if accumulate>=N :
accumulate -= primeList[s]
s += 1
elif accumulate<N :
if e == len(primeList) : break
accumulate += primeList[e]
e += 1
print(ans)