분수의 덧셈
2024. 7. 2. 18:00ㆍ코딩테스트 입문
https://school.programmers.co.kr/learn/courses/30/lessons/120808
문제 설명
첫 번째 분수의 분자와 분모를 뜻하는 numer1, denom1, 두 번째 분수의 분자와 분모를 뜻하는 numer2, denom2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.
제한사항
- 0 <numer1, denom1, numer2, denom2 < 1,000
입출력 예
numer1 | denom1 | numer2 | denom2 | result |
1 | 2 | 3 | 4 | [5, 4] |
9 | 2 | 1 | 3 | [29, 6] |
입출력 예 설명
입출력 예 #1
- 1 / 2 + 3 / 4 = 5 / 4입니다. 따라서 [5, 4]를 return 합니다.
입출력 예 #2
- 9 / 2 + 1 / 3 = 29 / 6입니다. 따라서 [29, 6]을 return 합니다.
어려운 문제는 아닙니다. 다만 좀 헷갈릴 만한 요소가 있네요.
보통은 소수로 해결하면 문제가 편한데, 이 경우에는 분수로 표현합니다.
분모의 최소공배수로 값을 처리하는 방법이니만큼, 최대공약수를 지원하는 패키지를 쓰면 편합니다.
여담으로 파이썬 버전마다 지원하는 패키지가 다르기에 패키지에만 의존하면 어려울 수 있습니다.
특히 최소공배수인 lcm은 gcd와는 다르게 3.9버전 이상의 파이썬에서만 지원합니다.
이번엔 최대공약수 공식을 사용해서 문제를 풀어보겠습니다.
# gcd 기능을 사용하기 위한 math 패키지
import math
def solution(numer1, denom1, numer2, denom2):
# 기약분수 기준으로 분모, 분자 설정
numer = numer1 * denom2 + numer2 * denom1
denom = denom1 * denom2
# 분모, 분자의 최대공약수 설정
gcd = math.gcd(numer, denom)
# 분모, 분자를 최대공약수로 나눠줌
numer //= gcd
denom //= gcd
# 약분된 분수 반환
return [numer, denom]
최소공배수를 사용할 필요 없는 문제입니다.
우선 두 분모를 곱해서 확실하게 분모를 통일합니다. 이 분모를 바탕으로 분자도 값을 맞춰줍니다.
이제 분모와 분자의 최대공약수를 구합니다.
구한 최대공약수로 분모, 분자를 나눠주고 리스트로 반환하면 끝입니다.
어려운 문제는 아니고, 좀 귀찮은 문제였습니다.