출처 : 백준 #1644
시간 제한 | 메모리 제한 |
---|---|
2초 | 128MB |
하나 이상의 연속된 소수의 합으로 나타낼 수 있는 자연수들이 있다. 몇 가지 자연수의 예를 들어 보면 다음과 같다.
하지만 연속된 소수의 합으로 나타낼 수 없는 자연수들도 있는데, 20이 그 예이다. 7+13을 계산하면 20이 되기는 하나 7과 13이 연속이 아니기에 적합한 표현이 아니다. 또한 한 소수는 반드시 한 번만 덧셈에 사용될 수 있기 때문에, 3+5+5+7과 같은 표현도 적합하지 않다.
자연수가 주어졌을 때, 이 자연수를 연속된 소수의 합으로 나타낼 수 있는 경우의 수를 구하는 프로그램을 작성하시오.
첫째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 4,000,000)
첫째 줄에 자연수 N을 연속된 소수의 합으로 나타낼 수 있는 경우의 수를 출력한다.
20
0
3
1
41
3
53
2
# 에라토스테네스의 체
def prime_search(n):
temp = [True] * n
m = int(n** 0.5)
for i in range(2, m+1):
if temp[i] == True:
for j in range(i+i, n, i):
temp[j] = False
return [i for i in range(2, n) if temp[i] == True]
p
start
# 백준 1644번 소수의 연속합
from sys import stdin
from itertools import combinations
input = stdin.readline
n = int(input())
prime_arr = []
def prime_check(n):
for number in range(2, int(n**(0.5))+1):
if n % number == 0:
return False
return True
# 에라토스테네스의 체
def prime_search(n):
temp = [True] * n
m = int(n** 0.5)
for i in range(2, m+1):
if temp[i] == True:
for j in range(i+i, n, i):
temp[j] = False
return [i for i in range(2, n) if temp[i] == True]
if n == 1:
print(0)
else:
# n 미만의 소수 다 찾기
prime_arr = prime_search(n)
p_length = len(prime_arr)
result = 0
start = -1
p = -1
count = 0
# 투포인터로 시도해보기!
while p < p_length:
# 연속된 소수의 합이 n보다 작거나 같을 경우
if result <= n:
p += 1
if result == n: # 같으면 count += 1
count += 1
if p < p_length:
result += prime_arr[p]
else: # 연속된 소수의 합이 n보다 클 경우
while result > n:
if start < p:
start += 1
result -= prime_arr[start]
else:
break
# n이 소수라면
if prime_check(n):
count += 1
print(count)