BAEKJOON #1644 소수의 연속합 - (수학) - python
소수의 연속합
출처 : 백준 #1644
시간 제한 | 메모리 제한 |
---|---|
2초 | 128MB |
문제
하나 이상의 연속된 소수의 합으로 나타낼 수 있는 자연수들이 있다. 몇 가지 자연수의 예를 들어 보면 다음과 같다.
- 3 : 3 (한 가지)
- 41 : 2+3+5+7+11+13 = 11+13+17 = 41 (세 가지)
- 53 : 5+7+11+13+17 = 53 (두 가지)
하지만 연속된 소수의 합으로 나타낼 수 없는 자연수들도 있는데, 20이 그 예이다. 7+13을 계산하면 20이 되기는 하나 7과 13이 연속이 아니기에 적합한 표현이 아니다. 또한 한 소수는 반드시 한 번만 덧셈에 사용될 수 있기 때문에, 3+5+5+7과 같은 표현도 적합하지 않다.
자연수가 주어졌을 때, 이 자연수를 연속된 소수의 합으로 나타낼 수 있는 경우의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 4,000,000)
출력
첫째 줄에 자연수 N을 연속된 소수의 합으로 나타낼 수 있는 경우의 수를 출력한다.
입출력 예시
예제 입력 1
20
예제 출력 1
0
예제 입력 2
3
예제 출력 2
1
예제 입력 3
41
예제 출력 3
3
예제 입력 4
53
예제 출력 4
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
python code
# 백준 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)
Author And Source
이 문제에 관하여(BAEKJOON #1644 소수의 연속합 - (수학) - python), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@nathan29849/BAEKJOON-1644-소수의-연속합-수학-python저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)