관리 메뉴

솜씨좋은장씨

[BaekJoon] 1735번 : 분수 합 (Python) 본문

Programming/코딩 1일 1문제

[BaekJoon] 1735번 : 분수 합 (Python)

솜씨좋은장씨 2021. 12. 6. 18:58
반응형

코딩 1일 1문제! 오늘의 문제는 백준의 분수 합 입니다.

 

1735번: 분수 합

첫째 줄과 둘째 줄에, 각 분수의 분자와 분모를 뜻하는 두 개의 자연수가 순서대로 주어진다. 입력되는 네 자연수는 모두 30,000 이하이다.

www.acmicpc.net

👨🏻‍💻 문제 풀이

이 문제는 최소 공배수와 최대 공약수를 활용하여 풀었습니다.

이에 먼저 파이썬의 기본 내장 라이브러리인 math의 gcd를 활용하여 최대 공약수와 최소공배수를 구해주는 함수를 먼저

만들어주었습니다.

def LCM(N, M):
    return N*M // gcd(N, M)

def GCD(N, M):
    return gcd(N, M)

그 다음 예제 입력을 참고하여 분수 2개를 입력 받았습니다.

frac1 = list(map(int, input().split()))
frac2 = list(map(int, input().split()))
print(fraction_sum(frac1, frac2))

입력을 받은 뒤에

numerator1, denominator1 = frac1[0], frac1[1]
numerator2, denominator2 = frac2[0], frac2[1]

각각 분자, 분모로 나누어 주었습니다.

lcm = LCM(denominator1, denominator2)

이렇게 입력받은 분모 2개를 활용하여 분모의 최소 공배수를 구합니다.

ext_1, ext_2 = lcm // denominator1, lcm // denominator2

분모를 최소공배수로 바꾸었을때 분자에도 곱해줄 값을 구하기 위해서 각각 최소공배수 // 분모 값으로 그 값을 구해줍니다.

numerator1, numerator2 = numerator1 * ext_1, numerator2 * ext_2

구한 값을 각각 분자에 곱해준 뒤에

ans_numerator, ans_denominator = numerator1 + numerator2, lcm

 

두개를 더해서 정답 분자 값으로 아까 구해뒀던 최소공배수 값을 정답 분모 값으로 지정합니다.

 

그런데! 우리는 더이상 약분이 되지 않는 기약분수 형태로 정답을 내 놓아야하므로

gcd = GCD(ans_numerator, ans_denominator)
    
if gcd != 1:
    ans_numerator = ans_numerator // gcd
    ans_denominator = ans_denominator // gcd

분모와 분자의 최대 공약수의 값이 1이 아닐 경우 

각각 분모와 분자에서 최대 공약수 값을 나눈 뒤 이를 정답으로 사용합니다.

f"{ans_numerator} {ans_denominator}"

마지막으로 정답을 f-string으로 만들어주면 끝!

 

전체 코드는 아래를 참고해주세요.

👨🏻‍💻 코드 ( Solution )

from math import gcd

def LCM(N, M):
    return N*M // gcd(N, M)

def GCD(N, M):
    return gcd(N, M)

def fraction_sum(frac1, frac2):
    numerator1, denominator1 = frac1[0], frac1[1]
    numerator2, denominator2 = frac2[0], frac2[1]
    
    lcm = LCM(denominator1, denominator2)
    
    ext_1, ext_2 = lcm // denominator1, lcm // denominator2
    
    numerator1, numerator2 = numerator1 * ext_1, numerator2 * ext_2
    
    ans_numerator, ans_denominator = numerator1 + numerator2, lcm
    
    gcd = GCD(ans_numerator, ans_denominator)
    
    if gcd != 1:
        ans_numerator = ans_numerator // gcd
        ans_denominator = ans_denominator // gcd
        
    return f"{ans_numerator} {ans_denominator}"


if __name__ == "__main__":
    frac1 = list(map(int, input().split()))
    frac2 = list(map(int, input().split()))
    print(fraction_sum(frac1, frac2))
 

GitHub - SOMJANG/CODINGTEST_PRACTICE: 1일 1문제 since 2020.02.07

1일 1문제 since 2020.02.07. Contribute to SOMJANG/CODINGTEST_PRACTICE development by creating an account on GitHub.

github.com

반응형
0 Comments
댓글쓰기 폼