[기본수학 2] 소인수분해, 소수 구하기
2021. 3. 28. 13:45ㆍ백준
11653번: 소인수분해
첫째 줄에 정수 N (1 ≤ N ≤ 10,000,000)이 주어진다.
www.acmicpc.net
1929번: 소수 구하기
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
www.acmicpc.net
소인수 분해 문제는 굳이 소수를 구하는 방식으로 풀어야 하나? 하는 생각이 들어서 그냥 쉽게 작성했다.
import sys
from sys import stdin
test = int(stdin.readline())
def get_factorization(no: int):
for i in range(2, no):
if no % i == 0:
print(i)
return get_factorization(no // i)
if no != 1:
print(no)
get_factorization(test)
그냥 안 나누어 떨어질 때까지 나눈다. 끝
소수구하기 문제 역시 기존에 사용했던 소수 로직 재사용 느낌이 강해서 그냥 풀었다.
from sys import stdin
import math
test = list(map(int, stdin.readline().split(" ")))
# 10 이하 소수 리스트
pn_list = [2, 3, 5, 7]
# 나머지 목록
rest_list = [1, 3, 7, 9]
def check_prime_no(no: int):
if no == 1:
return False
# 이미 소수 리스트에 속한 요소면 소수
if no in pn_list:
return True
rest = no % 10
if rest not in rest_list:
return False
for j in range(2, math.ceil(math.sqrt(no)) + 1):
if no % j == 0:
return False
return True
for i in range(test[0], test[1] + 1):
if check_prime_no(i):
print(i)
보다보니 소수 구하는 로직이 되게 조잡한 느낌이다;; 무작정 재사용할건 아닌 것 같다...