Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 reduce() 함수로 유리수 리스트의 곱 구하기

개요

유리수(fraction)들이 담긴 리스트가 주어졌을 때, 파이썬의 reduce() 함수를 사용하여 이들의 곱을 구하는 프로그램을 작성해 보겠습니다.

reduce() 함수는 두 개의 인자를 받는 함수를 리스트의 요소들에 대해 왼쪽에서 오른쪽으로 누적적으로 적용하면서 하나의 결과값을 만들어냅니다. functools 모듈에 포함되어 있어 import 후 사용할 수 있습니다.

문제 예시

예를 들어 입력이 다음과 같다면,

fractions = [(5,3),(2,8),(6,9),(5,12),(7,2)]

출력은 (175, 432)가 됩니다. 계산 과정은 다음과 같습니다.

5/3 × 2/8 × 6/9 × 5/12 × 7/2 = (5×2×6×5×7)/(3×8×9×12×2) = 2100/5184 = 175/432

해결 접근 방법

이 문제는 다음 단계를 통해 해결할 수 있습니다.

  • 새로운 리스트 fracs를 생성합니다.
  • 입력 리스트의 각 튜플(분자, 분모)에 대해 Fraction 객체를 만들어 fracs에 추가합니다.
  • reduce()에 곱셈 람다 함수(x * y)와 fracs 리스트를 전달하여 모든 유리수의 곱을 구합니다.
  • 결과값 t의 분자(numerator)와 분모(denominator)를 튜플로 반환합니다.

여기서 Fraction 클래스를 사용하는 핵심 이유는, Fraction 객체끼리 곱셈을 하면 파이썬이 자동으로 기약분수(약분된 분수)로 정리해 주기 때문입니다.

구현 코드

아래 예제 코드를 통해 더 자세히 살펴보겠습니다.

from fractions import Fraction
from functools import reduce

def solve(frac):
   fracs = []
   for f in frac:
      fracs.append(Fraction(*f))

   t = reduce(lambda x, y: x*y, fracs)
   return t.numerator, t.denominator

frac = [(5,3),(2,8),(6,9),(5,12),(7,2)]
print(solve(frac))

입력

[(5,3),(2,8),(6,9),(5,12),(7,2)]

출력

(175, 432)

코드 설명

  • Fraction(*f): 튜플을 언패킹하여 첫 번째 값을 분자, 두 번째 값을 분모로 하는 Fraction 객체를 생성합니다.
  • reduce(lambda x, y: x*y, fracs): 리스트의 첫 번째 요소부터 마지막 요소까지 순차적으로 곱셈을 수행합니다. 즉, ((f1 × f2) × f3) × ... 형태로 누적 계산됩니다.
  • t.numerator, t.denominator: 최종 곱의 결과에서 각각 분자와 분모를 추출하여 반환합니다.

이처럼 reduce()와 Fraction 클래스를 함께 사용하면 반복문 없이도 간결하게 여러 유리수의 곱을 계산할 수 있으며, 결과는 항상 약분된 기약분수 형태로 얻을 수 있습니다.