본문 바로가기

Problem Solving/BOJ-Gold

(Python) 백준 1016 - 제곱 ㄴㄴ 수

반응형

https://www.acmicpc.net/problem/1016

 

1016번: 제곱 ㄴㄴ 수

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

www.acmicpc.net

 

아이디어

- 특정 구간 내 모든 소수들을 효율적으로 구하기 위해서 에라토스테네스의 체를 사용

- 입력 값이 매우 크기 때문에 1부터 최대값이 아닌 최소값부터 최대값만 계산

 

 

 

코드

#입력
n,m=map(int,input().split())

#에라토스테네스의 체 생성 시 1이 아닌 최소값부터 시작
a=[1]*(m-n+1)

for i in range(2,int(m**.5)+1):
    k=i**2 # 제곱수
    
    # n 이하의 k의 배수 중 최댓값에서 시작
    for j in range(n//k*k, m+1, k):
    	
        # j는 최소값보다 작을 수 있으므로 체크해야 함
        if j-n>=0 and a[j-n]: a[j-n]=0

#남아있는 1의 개수 = 제곱ㄴㄴ수의 갯수
print(sum(a))

 

반응형