코딩테스트/PYTHON

[프로그래머스][PYTHON] Lv. 0 유한소수 판별하기

_알파카 2024. 3. 29. 23:21
728x90

문제 설명

https://school.programmers.co.kr/learn/courses/30/lessons/120878

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

내 풀이

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

 

[PYTHON] 분수 표현, 사칙연산 - Fraction

Fractions 파이썬의 Fractions 모듈은 분수 계산을 위한 라이브러리이다. 이 모듈은 분수의 기본 연산 (덧셈, 뺄셈, 곱셈, 나눗셈 등)을 지원하며, 실수와 분수의 혼합 계산도 가능하다. "Fractions" 모듈

yeonnys.tistory.com

위의 글은 분수를 표현할 수 있는 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 반환

 

 

느낀점

나는 문제에 나와있는 조건 그대로 풀었는데, 생각보다 이렇게 푼 사람은 많이 없는듯하다(아닌가..?)

다들 어떻게 저런 수학적인 방법을 생각해내는지 모르겠다. 

728x90