반응형

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

 

1016번: 제곱 ㄴㄴ 수

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

www.acmicpc.net

 

해결 방법 :

  • 검사해야 할 구간 배열을 만들고, 2부터 제곱의 배수를 탐색한다.
  • 그냥 순차적으로 모든 경우를 탐색하면 당연히 시간초과 발생.
    • 임의의 정수 x의 제곱이 구간 [minimum, maximun]에 처음으로 들어오는 배수를 찾음으로써 연산 횟수를 효과적으로 줄여준다. 
    • (mn // x**2) if mn이 x**2로 나눠지면, else (mn // x** 2) + 1
import sys
input = sys.stdin.readline

def solution(mn, mx):
    candidates = [1] * (mx - mn + 1) 검사 범위
    i = 2
    while i**2 <= mx: # 제곱수 자체가 mx를 넘어가면 확인 할 필요 X
        s = i ** 2 
        j = (mn // s) if mn % s == 0 else (mn // s) + 1 # [mn, mx]구간의 첫번째 배수
        
        while s * j <= mx: # mx 이하까지 검사
            candidates[(s * j) - mn] = 0
            j += 1
        i += 1

    return sum(candidates)

if __name__ == '__main__':
    mn, mx = map(int, input().split())
    result = solution(mn, mx)
    print(result)
반응형

'IT study > 알고리즘 문제 풀이' 카테고리의 다른 글

매출 하락 최소화  (0) 2021.05.19
백준 1019 : 책 페이지  (0) 2021.05.18
백준 1029 : 그림 교환  (0) 2021.05.16
백준 2098 : 외판원 순회  (0) 2021.05.16
백준 2579 : 계단 오르기  (0) 2021.05.13

+ Recent posts