Python: Code Taka 3주차 1

dev-swd·2020년 11월 16일
0

Code Taka

목록 보기
11/12

Q. 문제: 두 개의 input에는 복소수(complex number)가 string 으로 주어집니다. 복소수란 a+bi 의 형태로, 실수와 허수로 이루어진 수입니다. input으로 받은 두 수를 곱해서 반환해주세요. 반환하는 표현도 복소수 형태의 string 이어야 합니다.

  • 복소수 정의에 의하면 (i^2)는 -1 이므로 (i^2) 일때는 -1로 계산해주세요.
  • 제곱 표현이 안 되어 i의 2제곱을 (i^2)라고 표현했습니다.

나의 답

def complexNumberMultiply(a, b):
  complex_num = eval(a.replace("i", "j")) * eval(b.replace("i", "j"))
    
  complex_list = []
  
  complex_list.append(str(int(complex_num.real)))
  complex_list.append(str(int(complex_num.imag))+"i")
  
  if len(complex_list) < 2:
    return "0" + complex_list[0] + complex_list[1]
  else:
    return complex_list[0] + "+" + complex_list[1]
    1. 파이썬은 복소수(1+2a 와 같은 형태의 수)의 연산을 가능하게 하는 complex 라는 클래스가 있다.
    1. 처음에는 complex 클래스를 이용해서 계산을 도출하였는데 결과 값이 () 로 감싸있어서, 스트링 타입으로 리턴하기 위해서는 () 를 다시 replace 로 제거해줘야 했고, 2a 만 나왔을 경우 0을 다시 더해줘야 하는.. 코드가 계속해서 미궁속으로 빠져 생각을 달리했다.
    1. 그러다가 문득 파라미터로 들어오는 복수수의 값이 스트링인 것에 착안하여, eval 내장 함수가 생각나서 사용해보았다.
    1. 파이썬이 복소수를 계산하도록 하기 위해서는 i 를 j 로 바꾸어줄 필요가 있었고, i를 j 로 바꾼 스트링 값에 eval() 함수를 사용하여 복소수를 계산하도록 하였다.
    1. 계산 결과 값에서 complex.real 를 통해 실수를 뽑아내고, complex.imag 를 사용하여 허수를 추출해냈다.
    1. 그 후 다시 기대하는 리턴 값을 위하여 몇 가지 편집 처리를 거치고, "0"을 붙이는 연산을 처리하였다.

이 답 역시 꽤나 멀리 돌아온 코드라고 생각되며, 복소수 연산의 값을 편하게 얻고자 사용했던 eval() 함수가 오히려, 복잡한 연산을 만들어냈다고 생각된다.
그런데 또 이 때 아니면 언제 eval()을 사용해보나 싶어 사용하였는데, 어거지로 문제를 푼 것 같다는 생각이 든다.


솔루션

def complexNumberMultiply(a, b):
  """
  :type a: str
  :type b: str
  :rtype: str
  """

  firstArr = a[:-1].split('+')
  a1 = int(firstArr[0])
  a2 = int(firstArr[1])

  secondArr = b[:-1].split('+')
  b1 = int(secondArr[0])
  b2 = int(secondArr[1])
  
  return f'{a1 * b1 - a2 * b2}+{a1 * b2 + a2 * b1}i'

# 더 줄인 버전
def complexNumberMultiply2(a, b):
  """
  :type a: str
  :type b: str
  :rtype: str
  """
  a1, a2 = map(int, a[:-1].split('+'))
  b1, b2 = map(int, b[:-1].split('+'))
  return '%d+%di' % (a1 * b1 - a2 * b2, a1 * b2 + a2 * b1)

이 얼마나 깔끔한 답인가..
솔찍히 아직 a1 b1 한 값에 a2 b2 를 빼줘야 하는지 이해를 못하겠다.
수학을 한창 잘했던 고등학생 때로 돌아간다면 이해할 수 있을까.

profile
개발을 취미로 할 수 있는 그 때 까지

0개의 댓글