Good Bye, BOJ 2021! A번 - 2021은 무엇이 특별할까?
문제 : https://www.acmicpc.net/problem/24039
문제
연속한 두 소수의 곱으로 이루어져 있으면 특별한 수라 부른다고 약속한다.
주어진 수 N보다 큰 특별한 수 중 가장 작은 수를 구한다.
코드
약수는 대칭으로 존재하기 때문에 특정수의 제곱근값보다 작은 수의 범위에서 약수가 존재하지 않으면 제곱근값보다 큰 범위의 수에서도 약수가 존재하지 않는다.
이 점을 활용하여 소수 판별 함수 is_prime_num() 의 경우 소수 여부를 판단할 숫자가 num일 때 num의 제곱근 만큼만 반복문을 돌게 하여 연산횟수를 줄인다.
2부터 차례로 증가시키며 소수인 수를 구해 소수이면 리스트에 저장한다.
소수를 2개 찾았을 때 이 두 수는 연속적인 소수이므로 두 소수를 곱해 N보다 큰 특별한 수인지 비교한다.
맞으면 출력하고 아니면 두 소수 중 0번째 인덱스에 해당하는 먼저 구한 소수를 제거하고 새로운 소수를 찾아 N보다 큰 특별한 수 인지 검사한다.
import math
import sys
input = sys.stdin.readline
n = int(input())
def is_prime_num(num):
if num == 0 or num == 1:
return False
for i in range(2, int(math.sqrt(num)) + 1):
if num % i == 0:
return False
return True
p_num = []
i = 2
while True:
if len(p_num) == 2:
if p_num[0] * p_num[1] > n:
print(p_num[0] * p_num[1])
break
else:
p_num.pop(0)
if is_prime_num(i):
p_num.append(i)
i += 1
'PS > boj' 카테고리의 다른 글
[BOJ] 백준 1932번 : 정수 삼각형 (0) | 2022.01.11 |
---|---|
[BOJ] 백준 24049번 : 정원 (Easy) (0) | 2022.01.04 |
[BOJ] 백준 15649번 : N과 M (1) (0) | 2021.12.17 |
[BOJ] 백준 1260번 : DFS와 BFS (0) | 2021.11.29 |
댓글