알고리즘
백준 1016
Wonryeol
2021. 3. 13. 00:00
문제
어떤 수 X가 1보다 큰 제곱수로 나누어 떨어지지 않을 때, 제곱ㄴㄴ수라고 한다. 제곱수는 정수의 제곱이다. min과 max가 주어지면, min과 max를 포함한 사이에 제곱ㄴㄴ수가 몇 개 있는지 출력한다.
입력
첫째 줄에 두 정수 min과 max가 주어진다.
출력
첫째 줄에 [min,max]구간에 제곱ㄴㄴ수가 몇 개인지 출력한다.
해결방안
해당 방식은 에라토스테네스의 채 방식을 사용하였다. boolean list를 사용하엿으며 제곱수에 나눠 지는 수를 모두 false 로 두어 해결하고자 하였다.
min , mx = map(int,input().split())
check = [True]*(mx+1-min+1)
check[0] = False
for i in range(2,mx+1):
a = 0
cnt = max( min//(i**2),1 )
a = (i ** 2) * cnt
while a <= mx:
if a-min+1 > 0:
check[a-min+1] = False
cnt +=1
a = (i ** 2) * cnt
if i**2 > mx:
break
print(sum(check))