알고리즘/문제풀이

[백준] 1644번 소수의 연속합 - 파이썬(Python)

SeongOnion 2021. 2. 2. 12:46
728x90
시간 제한 메모리 제한
2 초 128 MB

 

문제 (링크)

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

 

1644번: 소수의 연속합

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

www.acmicpc.net

 

나의 풀이

import sys
import math

n = int(sys.stdin.readline())

# n이하의 수 중 소수를 찾아줄 배열 (에라토스테네스의 체)
prime_checker = [True for _ in range(n+1)]

# 소수가 아닌 0과 1에 대해 별도의 False처리
prime_checker[0:2] = False

for i in range(2, int(math.sqrt(n)) + 1):
	if prime_checker[i]:
    	j = 2
        while i * j <= n:
        	arr[i *j] = False
            j += 1

# n이하의 소수값을 담아줄 배열
arr = []
for i in range(n+1):
	if prime_checker[i]:
    	arr.append(i)

# arr에 대해서 투 포인터 알고리즘
end = 0
intervalSum = arr[0]
cnt = 0 # 경우의 수를 담아줄 변수

for start in range(len(arr)):
	while intervalSum < n and end < len(arr):
    	end += 1
        if end == len(arr):
        	break
        intervalSum += arr[end]
        
	if intervalSum == n:
    	cnt += 1
	
    intervalSum -= arr[start]

print(cnt)

 

접근 방법 및 코드 설명

기존의 투 포인터 알고리즘(배열의 연속된 값)에 소수 값들에 대한 처리를 해줘야하는 에라토스테네스의 체 방식을 결합시켜야하는 방식이다. 

 

입력 받은 n값에 대하여 2 ~ n까지의 모든 소수를 찾기 위해서 에라토스테네스의 체 방식을 사용해 걸러주고, 해당 소수를 arr라는 새로운 배열에 담아준다.

 

 arr에 2 ~ n까지의 소수값들이 담기고 나면, 기존의 투 포인터 방식을 이용해 intervalSum값을 구해주고 해당 값이 입력값 n과 같다면 경우의 수를 세 주는 cnt 변수에 1을 더해주는 방식이다.

 

두 개의 알고리즘을 모두 알고 있다면 어렵지 않게 짤 수 있는 코드였다.

 

 

투 포인터 알고리즘 - seongonion.tistory.com/47?category=868991

소수 판별 알고리즘 - seongonion.tistory.com/43?category=868991