문제 링크: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]
기본 라이브러리이지만, 만약 비슷한 문제의 풀이가 요구된다면 이러한 방법으로 푸는 것은 아닐 것이다. 외워두기만 하자.
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[Programmers][Python] 크기가 작은 부분 문자열 (0) | 2023.03.10 |
---|---|
[Programmers][Python] 최빈값 구하기 (0) | 2023.03.08 |
[Programmers][Python] 옹알이 (1) (0) | 2023.03.08 |
[Programmers][Python] 특이한 정렬 (0) | 2023.03.08 |
[Programmers][Python] 바탕화면 정리 (0) | 2023.03.06 |