CodeWars 03: Calculating with Functions

김기욱·2021년 3월 29일
0

코딩테스트

목록 보기
39/68
post-custom-banner

문제설명

This time we want to write calculations using functions and get the results. Let's have a look at some examples:

seven(times(five())) # must return 35
four(plus(nine())) # must return 13
eight(minus(three())) # must return 5
six(divided_by(two())) # must return 3

(예제참고) 숫자이름이 적힌 함수와 산술함수를 만들어라 함수콜을 통해 연산식을 완성해라

제한사항

  • 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
  1. 단순해보이지만 메모리에 저장되는 개념을 생각하지 않아서 오래걸렸던 문제입니다 ㅠ
  2. 삼항 연산자를 통해 None(함수가 들어오지 않을 경우)과 함수가 들어올 때 두 가지 케이스로 나눠서 리턴값을 다르게 설정합니다.
  3. 함수가 들어오지 않는다면 그대로 숫자만 리턴하면 되고, 아니라면 two(plus(... 와 같이 함수가 인자로 들어오므로 return에 이름에 대응하는(two = 2)숫자를 인자로 넣은 함수를 리턴해주면 됩니다.
  4. lambda를 활용해 각각에 연산에 맞는 함수를 리턴해주는 산술함수들을 작성해줍니다.
  5. two(plus(one())) 이라고 예제를 만들어서 로직의 흐름을 살펴봅시다.
    one()은 함수의 인자가 없으므로 if func in None 조건문에 걸려 1이 리턴됩니다.
    plus(1)의 리턴값은 lambda x : x + 1입니다. 이 lambda식은 메모리에 저장됩니다.
  6. 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이 리턴되게 됩니다.
profile
어려운 것은 없다, 다만 아직 익숙치않을뿐이다.
post-custom-banner

0개의 댓글