✔ 풀이를 위한 아이디어
✔ 수정 전 코드 [메모리 초과]
import sys
N, M = map(int, sys.stdin.readline().split())
nums = [1]*M
i = 2
while i**2 <= M: # i<=M보다 효율적이며, 이렇게만 해도 충분하다
j = i**2
while j <= M:
nums[j-1] = 0
j = j + i**2 # 이렇게 하나씩 더해줌으로써 4, 8, 12..
i += 1
count = M-N+1
for i in range(N, M+1):
if nums[i-1] == 0:
count -= 1
print(count)
✔ 수정 전 코드 [시간 초과]
import sys
N, M = map(int, sys.stdin.readline().split())
nums = [1]*(M-N+1) # 필요한 사이즈 만큼만 nums 생성
i = 2
while i**2 <= M:
j = i**2
while j < N: # 나누는 수가 최솟값보다 커질 때까지 while문 돌리기
j += i**2
while j <= M:
nums[j-N] = 0
j += i**2
i += 1
count = len(nums)
for i in range(M-N+1):
if nums[i] == 0:
count -= 1
print(count)
✔ 수정 후 코드
import sys
import math
N, M = map(int, sys.stdin.readline().split())
nums = [1]*(M-N+1)
i = 2
while i**2 <= M:
j = math.ceil(N / i**2) * (i**2) # while문을 돌리지 않고 그냥 한번에 구해버리기
while j <= M:
nums[j-N] = 0
j += i**2
i += 1
print(sum(nums)) # 이 부분은 바꾸지 않아도 되긴 하는데, 이렇게 처리하면 좀 더 깔끔
✔ 관련 개념