© 2025 anveloper.dev
GitHub·LinkedIn·Contact

목차

  • 문제
  • 입력
  • 출력
  • 예제
  • 풀이
  • 코드
  • 복잡도
풀이 목록으로 돌아가기

BOJ 1816 - 암호 키

2024-07-10
BOJ
브론즈 I
python
원본 문제 보기
수학
브루트포스
정수론

문제

BOJ 1816 - 암호 키

세 소수의 곱으로 이루어진 암호 키 S가 주어질 때, S의 모든 소인수가 100만보다 큰지 판별하라.

입력

첫째 줄에 테스트 케이스 수 N, 이후 N줄에 각 S가 주어진다.

출력

각 S에 대해 모든 소인수가 100만보다 크면 YES, 아니면 NO를 출력한다.

예제

입력출력
3 1471 2689 4003NO NO NO

풀이

에라토스테네스의 체로 100만 이하의 소수 목록을 구해놓고, 각 S가 이 소수 중 하나로 나누어지는지 확인한다.

  1. 2부터 100만까지 에라토스테네스의 체로 소수 목록을 생성한다
  2. 각 테스트 케이스에서 S를 소수 목록의 모든 소수로 나누어본다
  3. 어떤 소수로든 나누어지면 NO (100만 이하 소인수 존재)
  4. 모든 소수로 나누어지지 않으면 YES (모든 소인수가 100만 초과)

핵심 아이디어: 100만 이하의 소수만 미리 구하면, S에 100만 이하 소인수가 있는지를 효율적으로 판별할 수 있다.

코드

n = 1000000
a = [False, False] + [True] * (n - 1)
primes = []
 
for i in range(2, n + 1):
    if a[i]:
        primes.append(i)
        for j in range(2 * i, n + 1, i):
            a[j] = False
 
N = int(input())
for i in range(N):
    b = True
    S = int(input())
    for j in primes:
        if S % j == 0:
            b = False
    if b == True:
        print("YES")
    else:
        print("NO")

복잡도

  • 시간: O(N * pi(10^6)) (pi: 소수 개수, 약 78498개)
  • 공간: O(10^6)