문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/120878
내 풀이
from fractions import Fraction
import math
def solution(a, b):
# 기약분수 만들기
f = Fraction(a, b)
# 기약분수의 분모 값을 check_num에 담음
check_num = f.denominator
# 소인수분해
# 나누는 수 d
d = 2
# 소인수를 담을 리스트 f_list
f_list = []
while d <= check_num:
if check_num % d == 0:
if d not in f_list:
f_list.append(d)
check_num = check_num / d
else:
d = d + 1
# 소인수 중 2나 5가 있으면 제거
# 제거 후 아무것도 남아있지 않으면 return 1
if 2 in f_list:
f_list.remove(2)
if 5 in f_list:
f_list.remove(5)
if len(f_list) == 0:
return 1
return 2
파이썬의 내장 라이브러리인 Fraction과 math를 이용하였다.
유한소수인지 판별하기 위해서는 a/b를 기약분수로 나타내었을 때, 분모의 소인수가 2와 5만 존재해야 한다.
따라서 나는
1. Fraction 모듈로 기약분슈 만들기
2. 소인수 구하기
3. 소인수 중 2와 5만 있는지 판별하기
와 같은 방법으로 진행하였다.
2024.02.22 - [PYTHON] - [PYTHON] 분수 표현, 사칙연산 - Fraction
위의 글은 분수를 표현할 수 있는 Fraction 모듈에 관한 글이다!
추가적으로 소인수가 2와 5뿐인지 확인하는 방법에서, 나는 단순히 if문을 여러개 사용했지만,
다음과 같이 all을 사용하여 모든 경우가 참인지 확인하는 방식도 가능하다.
######## 내가 푼 방법
# 소인수 중 2나 5가 있으면 제거
# 제거 후 아무것도 남아있지 않으면 return 1
if 2 in f_list:
f_list.remove(2)
if 5 in f_list:
f_list.remove(5)
if len(f_list) == 0:
return 1
###### 다른 방법
if all(i in [2,5] for i in num):
return 1
다른 사람 풀이
from math import gcd
def solution(a, b):
b //= gcd(a,b)
while b%2==0:
b//=2
while b%5==0:
b//=5
return 1 if b==1 else 2
1. 분모를 최대공약수로 나눈다. 즉, 기약분수로 만들었을 떄의 분모값으로 만든다.
2. 2 혹은 5로 나눠질 때까지 나눈다. (각각 2와 5로 나누어 떨어지면 while문안에 진입하여 계속 나눈다. )
3. 나머지가 0이 아닐 때, 즉 더 이상 나눠지지 않을 때의 몫이 1이라면 1을 리턴하고, 아니라면 2를 리턴한다.
여기서 gcd() 함수는
최대공약수를 구하는 함수로,
gcd의 인자로 숫자들을 입력하면 인자로 들어온 숫자들의 최대 공약수를 반환한다.
인자가 없는 경우 0 반환
추가적으로 lcm() 함수는
최소공배수 함수로,
lcm의 인자로 숫자들을 입력하면 인자로 들어온 숫자들의 최대 공배수를 반환한다.
인자가 없는 경우 1 반환
느낀점
나는 문제에 나와있는 조건 그대로 풀었는데, 생각보다 이렇게 푼 사람은 많이 없는듯하다(아닌가..?)
다들 어떻게 저런 수학적인 방법을 생각해내는지 모르겠다.
'코딩테스트 > PYTHON' 카테고리의 다른 글
[프로그래머스][PYTHON] Lv. 0 다음에 올 숫자 (0) | 2024.04.02 |
---|---|
[프로그래머스][PYTHON] Lv. 0 특이한 정렬 (0) | 2024.04.02 |
[프로그래머스][PYTHON] Lv. 0 치킨 쿠폰 (0) | 2024.03.25 |
[프로그래머스][PYTHON] Lv. 0 등수 매기기 (0) | 2024.03.20 |
[프로그래머스][PYTHON] Lv. 0 이진수 더하기 (0) | 2024.03.20 |