문제
풀이
에라토스테네스의 체 알고리즘을 사용해 N 이하 소수들을 배열에 저장한 후, 해당 배열에서 투 포인터 기법으로 부분합을 구하여 풀이한다.
a = [False, False] + [True] * (N - 1) # [0, 1, 2, 3, ... N]
primes=[]
for i in range(2, N + 1):
if a[i]:
primes.append(i)
for j in range(2 * i, N + 1, i):
a[j] = False
에라토스테네스의 체로 N 이하 소수를 구해 primes 배열에 저장한다.
primes.sort()
이후 투 포인터를 사용할 것이므로 primes 배열을 오름차순 정렬해 준다.
left, right = 0 # 왼쪽, 오른쪽 인덱스
res = 0
while 0 <= left <= right < len(primes):
pSum = sum(primes[left: right + 1])
if pSum == N:
res += 1
left += 1
right += 1
elif pSum > N: # 큰 경우 - left 증가
left += 1
elif pSum < N: # 작은 경우 - right 증가
right += 1
일반적인 투 포인터 문제와 동일하게 풀이한다.
전체 코드
N = int(input())
a = [False, False] + [True] * (N - 1) # [0, 1, 2, 3, ... N]
primes=[]
for i in range(2, N + 1):
if a[i]:
primes.append(i)
for j in range(2 * i, N + 1, i):
a[j] = False
primes.sort()
left = 0
right = 0
res = 0
while 0 <= left <= right < len(primes):
pSum = sum(primes[left: right + 1])
if pSum == N:
res += 1
left += 1
right += 1
elif pSum > N: # 큰 경우 - left 증가
left += 1
elif pSum < N: # 작은 경우 - right 증가
right += 1
print(res)
'백준' 카테고리의 다른 글
백준 1504: 특정한 최단 경로(python) (0) | 2025.02.28 |
---|---|
백준 1238: 파티(python) (0) | 2025.02.28 |
백준 16724: 피리 부는 사나이(python) (0) | 2025.02.24 |
백준 1266: 다각형의 면적(python) (0) | 2025.01.08 |
백준 1647: 도시 분할 계획(python) (0) | 2025.01.08 |