Algorithm/📊 Problem Solving

[백준/BOJ] 1016 - 제곱 ㄴㄴ 수

posted by sangmin

1016 - 제곱 ㄴㄴ 수

문제

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

코드

a, b = map(int, input().split())
total = b - a + 1
check = [False] * (total + 1)

count = 0
idx = 2
while True:
    val = idx ** 2
    start = a // val

    if val > b:
        break

    if a % val != 0:
        start += 1

    while start * val <= b:
        if not check[start * val - a]:
            check[start * val - a] = True
            count += 1
        start += 1
    idx += 1

print(total - count)

한마디

에라토스테네스의 체를 응용한 문제이다. minmax 사이에 있는 가장 작은 제곱수의 배수를 찾는다. 예를 들어 min이 11이면 가장 작은 제곱수의 배수는 12(4 X 3)이다.
그리고 해당 제곱수의 배수를 늘려가며 check 배열에서 지워주면 된다.

 

1016번: 제곱 ㄴㄴ 수

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

www.acmicpc.net

 

'Algorithm > 📊 Problem Solving' 카테고리의 다른 글

[백준/BOJ] 11559 - Puyo Puyo  (0) 2021.01.22
[백준/BOJ] 15900 - 나무 탈출  (0) 2021.01.22
[백준/BOJ] 2251 - 물통  (0) 2021.01.20
[백준/BOJ] 3184 - 양  (0) 2021.01.20
[백준/BOJ] 1837 - 암호제작  (0) 2021.01.20