분수의 덧셈

2024. 7. 2. 18:00코딩테스트 입문

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

 

프로그래머스

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

programmers.co.kr


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


제한사항

  • 0 <numer1denom1numer2denom2 < 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]

최소공배수를 사용할 필요 없는 문제입니다.

우선 두 분모를 곱해서 확실하게 분모를 통일합니다. 이 분모를 바탕으로 분자도 값을 맞춰줍니다.

이제 분모와 분자의 최대공약수를 구합니다.

구한 최대공약수로 분모, 분자를 나눠주고 리스트로 반환하면 끝입니다.

 

어려운 문제는 아니고, 좀 귀찮은 문제였습니다.

'코딩테스트 입문' 카테고리의 다른 글

나머지 구하기  (0) 2024.07.04
배열 두 배 만들기  (0) 2024.07.03
숫자 비교하기  (0) 2024.07.01
두 수의 나눗셈  (0) 2024.06.30
몫 구하기  (0) 2024.06.29