코딩테스트

코딩테스트 입문_분수의 덧셈_fractions 모듈

끈끈 2023. 3. 24. 18:04

 

Lv. 0, 58%

 

문제

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


제한사항

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

입출력 예

 


입출력 예 #1

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

 

입출력 예 #2

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

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

 

프로그래머스

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

programmers.co.kr

 


 

맨 처음 numer1/denom1 + numer2/denom2 를 찍어보니 소수로 나오더라

 

일단 분수로 표현해주기 위해 fractions라는 모듈을 사용하는 방법이 있군

 

fractions 모듈은 문자열로 표현된 분수를 파싱하여 Fraction 클래스의 인스턴스로 변환할 수 있는 Fraction() 함수를 제공한다

 

https://docs.python.org/ko/3/library/fractions.html

 

fractions — Rational numbers

Source code: Lib/fractions.py The fractions module provides support for rational number arithmetic. A Fraction instance can be constructed from a pair of integers, from another rational number, or ...

docs.python.org

 

from fractions import Fraction

 

첫번째 인자에 분자, 두번째 인자에 분모

음수도 다룰 수 있다

소수를 분수로 나타낼 수도 있고, 문자로 이루어진 수를 분수로 바꿀 수도 있다

과학적 표기를 분수로 나타낼 수도 있고, 사칙연산도 가능하다

 

print(Fraction('-4/9')) # -4/9
print(Fraction(0.25)) # 1/4
print(Fraction('-0.25')) # -1/4
print(Fraction(1e-5)) 
print(Fraction('1e-6'))
print(Fraction('1/2') + Fraction('2/3')) # 7/6
print(Fraction('1/2') - Fraction('2/3')) # -1/6
print(Fraction('1/2') * Fraction('2/3')) # 1/3
print(Fraction('1/2') / Fraction('2/3')) # 3/4

a = Fraction(11, 20)
print(a.numerator) # 11 ## 분자 꺼내기
print(a.denominator) # 20 ## 분모 꺼내기

 


 

fraction으로 하니까 오류나더라. Fraction 대문자로 하기!

 

from fractions import Fraction


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


answer = solution(1, 2, 3, 4)
print(answer) # [5, 4]

answer = solution(9, 2, 1, 3)
print(answer) # [87069592795829589, 18014398509481984]

 

첫번째 결과는 잘 나왔는데 두번째는

 

numer2/denom2가 0.33333... 이어서? 이상하게 나와버림ㅋㅋㅋㅋㅋ

 

알고봤더니 쉼표를 안 넣어서 그랬나보다 멍충

 

from fractions import Fraction


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

 


 

또 다른 방법으로는 최대공약수를 이용하는 방법도 있다

 

먼저, math 라이브러리를 import 해야 한다

 

https://docs.python.org/ko/3/library/math.html?highlight=math#module-math 

 

math — Mathematical functions

This module provides access to the mathematical functions defined by the C standard. These functions cannot be used with complex numbers; use the functions of the same name from the cmath module if...

docs.python.org

 

최대공약수 math.gcd (greatest commen divisor)

 

둘 이상의 정수의 공약수 중에서 가장 큰 것

 

import math

math.gcd(3) # 3
math.gcd(3, 6) # 3
math.gcd(11, 22, 66) # 11

 

최소공배수 math.lcm (least commen multiple)

 

둘 이상의 정수의 공배수 중에서 가장 작은 것

 

import math

math.lcm(3) # 3
math.lcm(3, 6) # 6
math.lcm(11, 22, 66) # 66

 

최대공약수 math.gcd를 활용한 문제풀이법

 

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]