[BOJ] Q1644 소수의 연속합
[BOJ] Q1644
Question
Language: Python
Difficulty: Gold 3
주어진 숫자를 연속된 소수의 합으로 나타낼 수 있는 지 여부를 판단하는 문제이다.
이 문제의 핵심은
- 소수 판별법
- 연속된 숫자의 합의 개수
소수 판별법은 제곱근을 이용한 방식과, 에라토스테네스의 체를 이용하는 방식이 있는데, 해당 문제에는 소수의 집합이 필요하므로 에라토스테네스의 체를 활용한다.,
연속된 숫자의 합의 개수, 즉 부분합의 개수는 start, end 두 개의 포인터를 활용한 two-pointer을 활용하는 것이 좋다.
Solution
#에라토스테네스의 체
def era_filter():
primes=[True] * (n+1)
primes[0]=False
primes[1]=False
for i in range(2,n+1):
if primes[i]==False:
continue
times=2
while i*times < n+1:
primes[i*times]=False
times+=1
return [i for i in range(2,n+1) if primes[i]]
def solution():
primes=era_filter()
if n==1:
print(0)
exit(0)
count=0
start=0
end=0
length=len(primes)
sub_sum=primes[0]
#투 포인터
while True:
if sub_sum > n:
sub_sum-=primes[start]
start+=1
else:
if sub_sum==n:
count+=1
end+=1
if end ==length:
break
sub_sum+=primes[end]
print(count)
if __name__ == "__main__":
n=int(input())
solution()
댓글남기기