한국어/Hackerrank - 한국어 버전과 문제가 다를 수 있습니다. 채점은 Hackerrank를 추천합니다.
1 <= 입력개수 <= 10^3, 1 <= 입력값 <= 10^4
limit = 200000
primes = list(range(limit))
primes[0], primes[1] = 0, 0
for i in range(2, limit):
if primes[i]:
for j in range(i+i, limit, i):
primes[j] = 0
primes = tuple(prime for prime in primes if prime)
for _ in range(int(input())):
print(primes[int(input())-1])
이 문제는 미리 소수들을 구해놓지 않으면 매번 n번까지의 소수를 구하는 작업을 반복해야하기 때문에 자칫 시간초과가 나올 수 있는 문제입니다.
그렇기 때문에 에라토스테네스의 체 방식을 이용해 먼저 소수를 구합니다.
에라토스테네스의 체는 어떤 소수를 제외한 그 소수의 모든 배수를 없애는 방식으로 2의 경우 4부터 모든 짝수를, 3의 경우 9부터(6은 이미 2의 배수에서 삭제) 모든 3의 배수를 삭제합니다.
그런데 에라토스테네스의 체 방식은 걸러내는 방식이기 때문에 먼저 리스트의 크기를 정해주어야 합니다.
이건 먼저 10배 정도로 해보고 안되면 범위를 증가시키는 것을 추천드립니다.
그렇게 소수를 구하고 나면 소수를 제외한 나머지 수들은 없앤다음 (n-1)번째 인덱스를 출력하면 됩니다.
'알고리즘 공부 > 프로젝트 오일러(Project Euler)' 카테고리의 다른 글
{프로젝트 오일러/Project Euler} 9. 특별한 피타고라스 수 (0) | 2021.01.05 |
---|---|
{프로젝트 오일러/Project Euler} 8. 이어진 수의 곱의 최댓값 (0) | 2021.01.04 |
{프로젝트 오일러/Project Euler} 6. 제곱의 합과 합의 제곱의 차 (0) | 2021.01.03 |
{프로젝트 오일러/Project Euler} 5. 1~ N으로 나누어 떨어지는 수 (0) | 2021.01.02 |
{프로젝트 오일러/Project Euler} 4. 세자리 수를 곱해 만든 대칭수 (0) | 2021.01.01 |