이중 for문을 이용하므로 시간 복잡도가 O(N^2)라고 판단할 수 있고 실제 시간 복잡도는 최적화의 정도에 따라 다르겠지만 O(Nlog(log(N))이다. 그 이유는 배수를 삭제하는 연산으로 실제 구현에서 바깥쪽 for문을 생략하는 경우가 비넙ㄴ하게 발생하기 때문이다.
N의 제곱근이 n일 때 N = a * b 를 만족하는 a와 b가 모두 n보다 클 수 없다. a가 n보다 크면 b는 n보다 작아야 한다. 즉, N보다 작은 수 가운데 소수가 아닌 수는 항상 n보다 작은 약수를 가진다.
import math
M, N = map(int, input().split())
A = [i for i in range(N+1)] # 각각의 인덱스값으로 초기화
print(A)
for i in range(2, int(math.sqrt(N))+1): # 제곱근까지만 수행
if A[i] == 0:
continue
for j in range(i+i, N+1, i): # 배수 지우기
A[j] = 0
for i in range(M, N+1):
if A[i] != 0:
print(A[i])