https://www.acmicpc.net/problem/2023
문제를 풀기 앞서, 소수에 대해 알아보자!
소수(Prime Number) : 1과 자기 자신만을 약수로 갖는 수
흔히 에라토스테네스의 체 알고리즘으로 소수를 판별하기도 하지만, 이번 문제에서는 사용하지 않았다.
N이라는 숫자가 소수가 되려면 N은 range(2, N) 범위의 자연수로 나누어 떨어지면 안 된다.
예를 들어 4는 2~4 범위에서 2로 나누어 떨어지므로 소수가 아님을 알 수 있다.
N이 1 이상의 다른 수로 나눠지지 않는 소수인지 판별
n-1
까지의 수를 모두 확인하기 때문def is_prime(n):
for i in range(2, n):
if n % 1 == 0:
return False
return True
N 자신을 제외한 N의 약수 중에서 가장 큰 약수는 N/2보다 작거나 같기 때문에 위의 판별에서 범위를 줄여 소수인지 판별할 수 있다.
예를 들어, 12의 약수 1, 2, 3, 4, 6, 12 중 12 자신을 제외한 가장 큰 약수는 6으로 12/2와 같다.
def is_prime(n):
for i in range(2, n/2+1):
if n % i == 0:
return False
return True
n/2
까지의 자연수만 순회하여 첫번째 방법보다는 확인할 조건이 절반이지만, 여전히 느리다.📍 재귀 함수를 이용한 DFS 문제 (에라토스테네스의 체 알고리즘을 이용해 for문으로 풀이한다면 시간초과가 난다고 한다.)
sys.setrecursionlimit()
메서드는 Python 인터프리터 스택의 최대 깊이를 필요한 제한으로 설정하는 데 사용된다. 이 제한은 모든 프로그램이 무한 재귀에 들어가는 것을 방지한다.import sys
print(sys.getrecursionlimie()) # 1000
참고