Reduce Function

JavaScript에서 map, filter, reduce 함수를 집중적으로 배우면서 파이썬에서의 람다함수도 더 이해하게 된다. 그런 기념으로 reduce 함수를 활용한 파이썬 문제를 풀어보자.

문제 풀이

문제 해석

reduce()는 배열 각 요소에 대하여 이전에 작업한 결과를 리턴하여 다음 요소를 인수로 작업하는 함수이다.

Task

  • 공백으로 나뉘어진 두 숫자가 n번 주어지면, 이들을 분자, 분모로 하는 분수를 모두 곱한 값을 리턴하는 product() 함수를 만들어라.

    Input Format

  • 첫줄은 데이터 숫자인 N, 그 다음엔 N개의 행에 공백으로 구분된 분자와 분모가 온다.

Output Format

  • 위의 분수들을 다 곱한 값의 분자와 분모가, input처럼 공백으로 구분된 숫자로 와야한다.

문제 풀이

이미 주어진 코드 해석

1
2
3
4
5
6
7
8
9
10
11
12
13
from fractions import Fraction
from functools import reduce

def product(fracs):
t = # complete this line with a reduce statement
return t.numerator, t.denominator

if __name__ == '__main__':
fracs = []
for _ in range(int(input())):
fracs.append(Fraction(*map(int, input().split())))
result = product(fracs)
print(*result)
  • 울군선생님이 얘기했던 바 대로 reduce는 람다함수 중에서도 별도로 import를 해줘야 하기 때문에 @from functools import reduce가 적혀있다. 그리고 분수 처리를 위해 fraction도 import 되어 있다.
  • 함수에서 결과값을 분자 분모로 나누어 리턴하게끔 처리되어 있다.
  • fracs라는 빈 리스트에 n을 인풋으로 받고, 그 이후에 오는 수를 알아서 공백단위로 잘라 만든 분수를 fracs에 append 해준다. 내가 만들어야 하는 건 이 fracs에 담긴 분수들을 곱하기만 하면 되는 함수이다.

코드 작성하기

  • 리스트 속 각 요소를 다 곱해서 해커랭크가 준비해준 t라는 변수에 넣는다.
  • reduce의 첫 번째 인수로 reduce가 수행할 함수로 각 값을 곱하는 람다함수를 준다.
  • reduce의 두 번째 인수로 요소들을 제공할 리스트인 fracs를 넣어준다.
  • 세번째 함수인 초기값은 곱셈이니까 1로 준다.
1
2
def product(fracs):
t = reduce(lambda x, y: x * y, fracs, 1)

느낀 점

  • reduce와 lambda 함수를 드디어 이해한 것 같아 뿌듯하다.
  • 영원히 이해못할 줄 알았는데 감개무량.