코드
import math
def solution(a, b):
gcd = math.gcd(a, b) # 분모, 분자의 최대공약수를 구해 b를 최대공약수로 나눔
b //= gcd
num = [] # 소인수 저장
i = 2
while i <= b: # 소인수 구하기
if b % i == 0:
b //= i
num.append(i)
else:
i += 1
if all(i in [2,5] for i in num): # 소인수가 2와 5만 존재하면 유한소수 그렇징 않으면 무한소수
return 1
return 2
a, b값이 주어질 때, $\frac{a}{b}$ 를 기약분수로 만들어 유한소수인지 판별하는 문제이다.
유한소수가 되려면 분모의 소인수가 2와 5로만 구성되어 있어야 한다.
기약분수로 만들기 위해 a, b의 최대공약수를 구해 b를 최대공약수로 나누어 다시 b에 저장한다.
코드에서 a에 대해서는 작성하지 않은 이유는 문제에서 유한소수가 되기 위한 조건으로 분모에 대해 알려주었기 때문에 분자에 대해서는 신경 쓸 필요가 없다.
이제 b의 소인수가 2와 5 뿐인지 확인한다.
소인수를 구하는 방법을 그대로 사용해, 소인수를 num이라는 리스트에 저장하였다.
num의 모든 요소가 2와 5로만 구성되어 있는지 if문을 통해 확인한다.
이때 "모든" 요소가 2와 5로만 구성되어야 하기 때문에 all을 사용하여 모든 경우가 참인지 확인하는 것이다.
* 만약 하나라도 2와 5이면 된다는 조건이라면 any를 사용한다.
반응형