Python/파이썬 문제

[Python] 분수 덧셈 문제풀이

isfp_yykkng 2023. 3. 15. 01:09

분수 덧셈 문제풀이

문제

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

 

제한사항

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

 

입출력 예

풀이

두 분모 (denom) 이 서로 나눌 수 없는 수 (소수) 인 경우에 기본적인 분수의 덧셈은 다음과 같다.

numer1 / denom1 + numer2 / denom2 = (numer1 * denom2 + numer2 * denom1) / denom1 * denom2

즉, 쉬운 표시로는 a/b + c/d = (a*d + b*c) / b*d 이다. 

여기에 두 분모가 서로 나눌 수 있을 때를 대비하여 최대공약수(gcd)를 이용해주면 된다.

위와 같이 각각 구해서 나온 분자(numer) 와 분모(denom) 에 각각 최대공약수로 나눈 몫을 구하면 된다.

 

예를 들어, 입출력 예 1번을 보면 1/2 + 3/4 =(1*4 + 2*6) / 2*4 인데, 2는 4의 약수이다.

수학적인 계산으로만 보았을 때, 1/2 에만 분자, 분모 각각 2를 곱해주면 되는 일이다.

이를 각각 곱하고 더한 분자와 분모의 최대공약수를 이용하는 것이다.

구현

  • math 함수 이용
import math
def solution(numer1, denom1, numer2, denom2):
    numer = numer1*denom2 + numer2 * denom1
    denom = denom1 * denom2
    gcd = math.gcd(denom, numer)
    return [nummer//gcd, denom//gcd]
  • 유클리드 호제법을 써서 최대공약수(gcd) 구하는 함수 구현
def gcd(a,b):
	while b>0:
    	a, b = b, a%b
    return a

def solution(numer1, denom1, numer2, denom2):
    numer = numer1*denom2 + numer2 * denom1
    denom = denom1 * denom2
    gcd = gcd(denom, numer)
    return [numer//gcd, denom//gcd]

 

[참고] : 유클리드 호제법

https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C_%ED%98%B8%EC%A0%9C%EB%B2%95