[프로그래머스] 분수의 덧셈

Vincent·2023년 1월 16일
0

문제 설명

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

제한사항

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

입출력 예

numer1denom1numer2denom2result
1234[5,4]
9213[29,6]

입출력 예 설명

입출력 예 #1

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

입출력 예 #2
9 / 2 + 1 / 3 = 29 / 6입니다. 따라서 [29, 6]을 return 합니다.

풀이

활용개념 : math.gcd, math.lcm (최대공약수와 최소공배수)
기약분수를 만들어야 하기 때문에 최대공약수 필요
분수의 덧셈 위해 최소공배수 필요
근데 아직 프로그래머스에서는 math.lcm이 안되는 듯

import math

def solution(numer1, denom1, numer2, denom2):
    if denom1 == denom2 : #분모가 같을 때
        bunja = numer1 + numer2
        if math.gcd(bunja, denom1) == 1: #이미 기약분수일 때 (분모, 분자의 최대공약수가 1일 때)
            answer = [bunja,denom1]
        else: #기약분수로 만들 때
            answer = [bunja//math.gcd(bunja,denom1), denom1//math.gcd(bunja,denom1)]
    else:     
        i = 1
        denom1_list = []
        denom2_list = []
        while True:
            denom1_list.append(denom1*i)
            denom2_list.append(denom2*i)
            if denom1_list[-1] in denom2_list:
                result = denom1_list[-1]
                break
            elif denom2_list[-1] in denom1_list:
                result = denom2_list[-1]
                break
            i += 1
        numer1 = numer1 * (result//denom1)
        numer2 = numer2 * (result//denom2)
        bunja = numer1 + numer2
        if math.gcd(bunja, result) == 1:
            answer = [bunja,result]
        else:
            answer = [bunja//math.gcd(bunja,result), result//math.gcd(bunja,result)]
    
    return answer
profile
Frontend & Artificial Intelligence

0개의 댓글