프로그래밍/Python

[백준] 1016번 - 제곱ㄴㄴ수

뭉이씨 2025. 2. 19. 15:23

문제 링크 : 

 

문제

어떤 정수 X가 1보다 큰 제곱수로 나누어 떨어지지 않을 때, 그 수를 제곱ㄴㄴ수라고 한다. 제곱수는 정수의 제곱이다. min과 max가 주어지면, min보다 크거나 같고, max보다 작거나 같은 제곱ㄴㄴ수가 몇 개 있는지 출력한다.

 

입력

첫째 줄에 두 정수 min과 max가 주어진다.

 

출력

첫째 줄에 min보다 크거나 같고, max보다 작거나 같은 제곱ㄴㄴ수의 개수를 출력한다.

 

풀이

import math

A, B = map(int, input().split())
num = [False for _ in range(A,B+1)]
count = 0

for b in range(2,int(math.sqrt(B))+1):
    k = b*b
    start = max(A, ((A+k-1)//k)*k)
    for j in range(start,B+1,k):
        if not num[j-A]:
            if A <= j:
                count+=1
                num[j-A] = True
            
print(B-A+1-count)

 

해설

  • 에라토스테네스의 체를 응용하여 풀었다.
  • 처음엔 j를 설정하는 반복문의 start를 2로 설정하려했으나 런타임에러(IndexError)가 발생하였다. j-A가 B-A보다 클 수도 있어서 발생한 오류였다.
  • 그래서 start를 A이상으로 설정하여 에러를 방지하였다.
    • ((A+k-1)//k)*k) 는 A 이상 숫자 중 가장 작은 k의 배수를 말한다.