[알고리즘 문제풀이] 코드카타 10

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

풀이과정

  • 복소수 형태로 계산할 수 있도록 식을 만든다.
  • 문자열 형태 그대로 계산할 수 있는 eval을 사용해 계산한 후 j를 i로 바꿔준다.
  • 실수 부분이 없을 경우 (0인 경우) 문자열 맨 앞에 '0+'을 붙여 반환한다.
  • 그렇지 않다면 (실수 부분이 있다면) 괄호를 제외한 결과값을 반환한다.

코드

def complex_number_multiply(a, b):
  a = a.replace('i', 'j')
  b = b.replace('i', 'j')
  exp = '('+ a + ')'+ '*' + '(' + b + ')'
  result = str(eval(exp)).replace('j','i')
  
  if '+' not in result:
    return '0+' + result

  return result[1:len(result)-1]

리팩토링

def complex_number_multiply(a, b):
  a = a.replace('i', 'j')
  b = b.replace('i', 'j')
  exp = f"({a})*({b})" # f-string 사용
  result = str(eval(exp)).replace('j','i')

  if '+' not in result:
    return '0+' + result

  return result[1:len(result)-1]

-> 문자열로 식을 만들어주는 과정에서 + 연산자를 사용하여 문자열을 이어붙였다. 하지만 이 방식은 가독성이 떨어져 f-string을 사용하여 가독성을 높였다. 다만 if문 내에서는 +연산자를 쓰는게 더 간단해보여 굳이 f-string을 쓰지 않았다.

다른 풀이

def complex_number_multiply(a, b):
  a1, a2 = map(int, a[:-1].split("+"))
  b1, b2 = map(int, b[:-1].split("+"))

  return f"{a1*b1-a2*b2}+{a1*b2+a2*b1}i"

split을 이용해 '+'를 기준으로 실수부분과 허수부분을 나누고 각각의 원소들을 곱해주었다. 이렇게 하면 0을 추가해주는 것과 i를 j로 변환하는 처리를 해줄 필요가 없다.

좋은 웹페이지 즐겨찾기