728x90
https://www.acmicpc.net/problem/31216
31216번: 슈퍼 소수
소수는 수학을 사랑하는 누구에게나 매우 중요한 개념입니다. $1$보다 크면서 약수가 $1$과 자기 자신뿐인 자연수를 소수라고 부릅니다. 흐즈로는 소수 중에서도 더욱 특별한 소수가 있다고 생각
www.acmicpc.net
24/01/08
간단한 소수 판정 응용 문제다.
문제 접근 방식:
문제는 매우 간단하다.
소수를 오름 차순으로 나열하여 $k$번째 소수가 있을 때, 이 $k$가 소수라면 그 소수를 슈퍼 소수라고 한다.
우리의 목적은 $n$이 주어지면 $n$번째 슈퍼 소수를 찾는 것이 우리의 목적이다.
여기서 주어지는 $n$은 최대 $3,000$까지이다.
$100$만 이하의 소수의 개수는 $78,498$개이므로, $3,000$개의 슈퍼 소수를 찾는 일은 충분할 것이라고 생각되어, $100$만 이하의 소수를 에라토스테네스의 체로 먼저 구하였다.
이후 소수가 나올 때마다, $k$번째 소수임을 따져서, 이 $k$도 소수임을 확인하였다.
굳이 에라토스테네스의 체를 쓰지 않아도 통과된다고는 하는데, 에테체가 그렇게 어려운 알고리즘은 아니니 그냥 에테체로 구현하는 것이 나아 보인다.
아래는 내가 위의 접근 방식과 같이 작성한 파이썬 코드이다. 더 보기를 누르면 확인할 수 있다.
더보기
# 31216번 슈퍼 소수
# 수학, 정수론, 에테체
import sys
input = sys.stdin.readline
T = int(input())
sieve = [1 for _ in range(1_000_000)]
sieve[0], sieve[1] = 0, 0
for i in range(2, 1_000):
if sieve[i]:
for j in range(i*i, 1_000_000, i):
sieve[j] = 0
super_prime = []
k_th = 0
for i in range(1_000_000):
if sieve[i]:
k_th += 1
if sieve[k_th]:
super_prime.append(i)
for _ in range(T):
print(super_prime[int(input())-1])
728x90
'알고리즘 > 백준 문제 풀이' 카테고리의 다른 글
[Python] 31218번 자료 구조의 왕 (0) | 2024.01.20 |
---|---|
[Python] 31217번 Y (0) | 2024.01.10 |
[Python] 10978번 기숙사 재배정 (0) | 2024.01.08 |
[Python] 14503번 로봇 청소기 (0) | 2024.01.08 |
[Python] 23630번 가장 긴 부분 수열 구하기 (0) | 2024.01.07 |