Algorithm/프로그래머스

[Programmers] 분수의 덧셈

NegotiationMan 2023. 3. 17. 16:46

문제 설명

첫 번째 분수의 분자와 분모를 뜻하는 numer1, denom1, 두 번째 분수의 분자와 분모를 뜻하는 numer2, denom2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해 보세요.

 

제한사항

  • 0 <numer1, denom1, numer2, denom2 < 1,000

 

입출력 예

numer1 denom1 numer2 denom2 result
1 2 3 4 [5, 4]
9 2 1 3 [29, 6]

 

입출력 예 설명

입출력 예 #1

  • 1 / 2 + 3 / 4 = 5 / 4입니다. 따라서 [5, 4]를 return 합니다.

입출력 예 #2

  • 9 / 2 + 1 / 3 = 29 / 6입니다. 따라서 [29, 6] return 합니다.

 


나의 풀이

문제를 보고 처음에 math.lcm() 함수를 이용해서 풀려고 했었다.

하지만 에러가 발생했고 찾아보니 Python 3.9 이전 버전에서는  math.lcm 함수를 사용할 수 없다고 한다.

그래서 직접 함수 lcm() 함수를 만들어 보았다.

 

def solution(numer1, denom1, numer2, denom2):
    common_denom = lcm(denom1, denom2)
    numer = numer1 * (common_denom // denom1) + numer2 * (common_denom // denom2)
    gcd = math.gcd(numer, common_denom)
    numer //= gcd
    common_denom //= gcd
    return [numer, common_denom]
    
def lcm(a, b):
    return abs(a*b) // math.gcd(a, b)

참고할만한 풀이

 

import math

def solution(denum1, num1, denum2, num2):
    denum = denum1 * num2 + denum2 * num1
    num = num1 * num2
    gcd = math.gcd(denum, num)
    return [denum//gcd, num//gcd]

훨씬 더 직관적이다.

from fractions import Fraction

def solution(denum1, num1, denum2, num2):
    answer = Fraction(denum1, num1) + Fraction(denum2, num2)
    return [answer.numerator, answer.denominator]

'fractions' 모듈은 부동 소수점 숫자를 분수로 변환하고 분수에 대한 산술 연산을 수행하는 등 분수 작업을 위한 다양한 방법을 제공한다.

그리고 answer.numerator를 이용하면 분자값에 액세스 할 수 있고, answer.denominator를 이용하면 분자값에 액세스 할 수 있다.분수 문제에는 Fraction 클래스를 사용하는 게 좋을 것 같다.

 

역시 파이썬은 편리한 라이브러리가 많은 것 같다.