본문 바로가기
코딩테스트 파이썬/백준

거의 소수 ( 1456 번 )

by 세용용용용 2025. 10. 2.

1456번: 거의 소수

 


🧠 알고리즘

  • 소수 판별(에라토스테네스의 체) + 소수 거듭제곱 생성

 

✔️ 동작 방식

  • b의 제곱근까지만 에라토스테네스의 체를 돌려서 소수 목록을 구함.
  • 구한 소수 리스트를 순회하면서 각 소수 p의 거듭제곱을 계산.
  • 그 값이 a ~ b 범위 안에 있으면 집합(same_check)에 저장.
  • 최종적으로 집합 크기를 반환 → 범위 내 “거의 소수”의 개수

 

🧾 코드

import sys

def _get_sosu(b):
    answer = []
    max_num = int(b ** (0.5))
    check = [True] * (max_num + 1)
    check[0], check[1] = False, False

    for i in range(2, int(max_num ** (0.5)) + 1):
        if check[i]:
            for j in range(i * i, max_num + 1, i):
                check[j] = False

    for i in range(max_num + 1):
        if check[i]:
            answer.append(i)

    return answer
    
def _main(a, b):
    sosu_list = _get_sosu(b)
    same_check = set()

    for sosu in sosu_list:
        now_num = sosu * sosu

        while True:
            if now_num > b:
                break
            if now_num >= a:
                same_check.add(now_num)
            now_num *= sosu

    return len(same_check)


a, b = map(int, sys.stdin.readline().rstrip().split())
print(_main(a, b))

 

⏱️ 시간 복잡도

_get_sosu(b) : 에라토스테네스의 체 ( 로그 시간 복잡도 )
for sosu in sosu_list : 소수를 순회, b의 제곱근 크기 ( 제곱근 시간 복잡도 )

해당 알고리즘 시간 복잡도 : 제곱근 시간 복잡도 ( O(b ** (0.5)) )

'코딩테스트 파이썬 > 백준' 카테고리의 다른 글

사회망 서비스(SNS) ( 2533 번 )  (0) 2025.10.04
다이어트 ( 1484 번 )  (0) 2025.10.02
공항 ( 10775 번 )  (3) 2025.10.01
숌 사이 수열 ( 1469 번 )  (0) 2025.10.01
새 앨범 ( 1424 번 )  (0) 2025.09.29