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
맨 처음 numer1/denom1 + numer2/denom2 를 찍어보니 소수로 나오더라
일단 분수로 표현해주기 위해 fractions라는 모듈을 사용하는 방법이 있군
fractions 모듈은 문자열로 표현된 분수를 파싱하여 Fraction 클래스의 인스턴스로 변환할 수 있는 Fraction() 함수를 제공한다
https://docs.python.org/ko/3/library/fractions.html
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.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]
'코딩테스트' 카테고리의 다른 글
코딩테스트 입문_최댓값 만들기(1) (2) | 2023.03.31 |
---|---|
코딩테스트 입문_최빈값 구하기_sorted() (0) | 2023.03.30 |
코딩테스트 카카오_숫자 문자열과 영단어_isdecimal replace (0) | 2023.03.24 |
코딩테스트 입문_옹알이(1)_permutations (2) | 2023.03.23 |
코딩테스트 연습문제_짝수와 홀수 (0) | 2023.03.22 |