소수점 아래 숫자가 계속되지 않고 유한개인 소수를 유한소수라고 합니다. 분수를 소수로 고칠 때 유한소수로 나타낼 수 있는 분수인지 판별하려고 합니다. 유한소수가 되기 위한 분수의 조건은 다음과 같습니다.
- 기약분수로 나타내었을 때, 분모의 소인수가 2와 5만 존재해야 합니다.
두 정수 a와 b가 매개변수로 주어질 때, a/b가 유한소수이면 1을, 무한소수라면 2를 return하도록 solution 함수를 완성해주세요.
a, b는 정수
0 < a ≤ 1,000
0 < b ≤ 1,000
a b result 7 20 1 11 22 1 12 21 2
입출력 예 #1
분수 7/20은 기약분수 입니다. 분모 20의 소인수가 2, 5 이기 때문에 유한소수입니다. 따라서 1을 return합니다.
입출력 예 #2
분수 11/22는 기약분수로 나타내면 1/2 입니다. 분모 2는 소인수가 2 뿐이기 때문에 유한소수 입니다. 따라서 1을 return합니다.
입출력 예 #3
분수 12/21는 기약분수로 나타내면 4/7 입니다. 분모 7은 소인수가 7 이므로 무한소수입니다. 따라서 2를 return합니다.
활용개념 : 에라토스테네스의 체
- 다수의 자연수에 대하여 소수 여부를 판별할 때 사용하는 대표적인 알고리즘이다
- 에라토스테네스의 체는 N보다 작거나 같은 모든 소수를 찾을 때 사용할 수 있다
<동작과정>
1. 2부터 𝑁까지의 모든 자연수를 나열한다
2. 남은 수 중에서 아직 처리하지 않은 가장 작은 수 𝑖를 찾는다
3. 남은 수 중에서 i의 배수를 모두 제거한다(𝑖는 제거하지 않는다)
4. 더 이상 반복할 수 없을 때까지 2번과 3번의 과정을 반복한다
import math
def solution(a, b):
# 기약분수 만들기
s = math.gcd(a,b)
a = a // s
b = b // s
#에라토스테네스의 체
array = [True for i in range(b+1)]
for i in range(2,b+1):
if array[i] == True:
j = 2 #i는 제외한 배수 제거
while i * j <= b:
array[i * j] = False
j += 1
lst = []
for k in range(2,len(array)):
if (array[k] == True) and (b % k == 0): #약수들만 담기
lst.append(k)
for i in lst:
if i ==2 or i == 5:
continue
else:
return 2 #2나 5가 아닌 값이 나오면 바로 종료
return 1