문제설명
This time we want to write calculations using functions and get the results. Let's have a look at some examples:
seven(times(five()))
four(plus(nine()))
eight(minus(three()))
six(divided_by(two()))
(예제참고) 숫자이름이 적힌 함수와 산술함수를 만들어라 함수콜을 통해 연산식을 완성해라
제한사항
- There must be a function for each number from 0 ("zero") to 9 ("nine")
0부터 9까지 각각의 숫자에 대응하는 함수를 만들어라
- There must be a function for each of the following mathematical operations: plus, minus, times, dividedBy (divided_by in Ruby and Python)
사칙연산에 역할을 할 수 있는 함수들을 만들어라
- Each calculation consist of exactly one operation and two numbers
하나의 계산식에는 정확하게 1개의 산술함수와 두 개의 숫자함수가 포함되어야 한다.
- The most outer function represents the left operand, the most inner function represents the right operand
가장 바깥의 함수가 계산식에 왼쪽, 가장 안쪽 함수가 계산식의 오른쪽에 위치하게 된다.
- Division should be integer division. For example, this should return 2, not 2.666666...:
나누기 연산의 결과값은 반드시 정수여야 한다. 예를들어 2.6666..으로 결과값이 나온다면 2로 반환되어야한다.
입출력 예시
eight(divided_by(three())) 결과값 : 2
풀이
def zero(func = None):
return 0 if func is None else func(0)
def one(func = None):
return 1 if func is None else func(1)
def two(func = None):
return 2 if func is None else func(2)
def three(func = None):
return 3 if func is None else func(3)
def four(func = None):
return 4 if func is None else func(4)
def five(func = None):
return 5 if func is None else func(5)
def six(func = None):
return 6 if func is None else func(6)
def seven(func = None):
return 7 if func is None else func(7)
def eight(func = None):
return 8 if func is None else func(8)
def nine(func = None):
return 9 if func is None else func(9)
def plus(y):
return lambda x: x+y
def minus(y):
return lambda x: x-y
def times(y):
return lambda x: x*y
def divided_by(y):
return lambda x: x//y
- 단순해보이지만 메모리에 저장되는 개념을 생각하지 않아서 오래걸렸던 문제입니다 ㅠ
- 삼항 연산자를 통해 None(함수가 들어오지 않을 경우)과 함수가 들어올 때 두 가지 케이스로 나눠서 리턴값을 다르게 설정합니다.
- 함수가 들어오지 않는다면 그대로 숫자만 리턴하면 되고, 아니라면 two(plus(... 와 같이 함수가 인자로 들어오므로 return에 이름에 대응하는(two = 2)숫자를 인자로 넣은 함수를 리턴해주면 됩니다.
- lambda를 활용해 각각에 연산에 맞는 함수를 리턴해주는 산술함수들을 작성해줍니다.
- two(plus(one())) 이라고 예제를 만들어서 로직의 흐름을 살펴봅시다.
one()은 함수의 인자가 없으므로 if func in None 조건문에 걸려 1이 리턴됩니다.
plus(1)의 리턴값은 lambda x : x + 1입니다. 이 lambda식은 메모리에 저장됩니다.
- two(plus(1))의 경우에는 one()과 다르게 인자가 들어옵니다. 아까 저장된 lambda x : x + 1이 들어오게 되죠. 주의할 점은 여기서 return인 func(2)는 plus(2)가 아닙니다. plus(2)가 아닌 저장되었던 lambda x : x + 1이 들어오게되죠. 그러므로 x = 2 가 되므로 lambda x : 2 + 1로 3이 리턴되게 됩니다.