얼음녹차의 블로그
article thumbnail

문제 링크:https://school.programmers.co.kr/learn/courses/30/lessons/120808

 

프로그래머스

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

programmers.co.kr

 

처음 작성한 코드

  • 각 분수를 기약분수로 변환한 뒤, 최소공배수를 구해 분수를 더하고 다시 기약분수로 변환하는 프로세스이다.
  • 각 분수를 기약분수로 변환한다.
    • 여기서 irr_frac이라는 함수를 따로 작성해 주었는데, math 라이브러리의 gcd 함수를 이용하여 최대공약수를 구하고 분자 분모를 최대공약수로 나누어주면 기약분수가 된다.
  • 최소공배수를 이용한 분수들의 합은 다음과 같다
    • 분자는 상대 분모에서 분모들의 최대공약수를 나눈 값을 곱한 것과 같다
    • 분모는 분모들의 곱에서 분모들의 최대공약수를 나눈값과 같다.
  • 구한 분수들의 합을 다시 기약분수로 변환한다.
from math import gcd

def solution(numer1, denom1, numer2, denom2):
    numer1, denom1 = irr_frac(numer1, denom1)
    numer2, denom2 = irr_frac(numer2, denom2)
    denom_gcd = gcd(denom1, denom2)
    numer1 *= denom2 // denom_gcd
    numer2 *= denom1 // denom_gcd
    numer3 = numer1 + numer2
    denom3 = denom1 * denom2 // denom_gcd
    numer3, denom3 = irr_frac(numer3, denom3)
    return [numer3, denom3]

def irr_frac(n1, n2):
    g = gcd(n1, n2)
    if g != 1:
        n1 //= g
        n2 //= g
    return n1, n2

# 입출력 예시
print(solution(1, 2, 3, 4))
print(solution(9, 2, 1, 3))

사실 이렇게 까지 프로세스를 번거롭게 하지않아도된다. 다만 숫자들의 최적화를 계속 시키고 싶었다.

 

다른 코드

[코드1]

  • 간단하게 분수의 합을 더하는 방법이다.
  • 분자는 각 상대의 분자와 분모를 곱하여 더 해주면 된다.
  • 분모는 분모들의 곱이 된다.
  • 구한 분수를 분자와 분모의 최대공약수로 나누어 기약분수로 만들어준다.
from math import gcd

def solution(numer1, denom1, numer2, denom2):
    num3 = denom1 * numer2 + denom2 * numer1
    denom3 = denom1 * denom2
    frac_gcd = gcd(num3, denom3)
    return [num3//frac_gcd, denom3//frac_gcd]

 

[코드2]

  • 기본 내장 라이브러리인 fractions를 이용한 방법이다.
  • fractions 라이브러리의 Fraction 함수로 분자와 분모를 입력하면 분수 형태로 연산이 가능하다.
  • 출력 시에는 numerator과 denominator를 이용해 값을 반환받을 수 있다.
from fractions import Fraction

def solution(numer1, denom1, numer2, denom2):
    frac3 = Fraction(numer1, denom1) + Fraction(numer2, denom2)
    return [frac3.numerator, frac3.denominator]

기본 라이브러리이지만, 만약 비슷한 문제의 풀이가 요구된다면 이러한 방법으로 푸는 것은 아닐 것이다. 외워두기만 하자.

profile

얼음녹차의 블로그

@PERIR

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!