2개의 복소수의 곱의 결과를 구하기

백승진·2020년 11월 16일
0

문제

두 개의 input에는 복소수(complex number)가 string 으로 주어집니다.
복소수란 a+bi 의 형태로, 실수와 허수로 이루어진 수입니다.

input으로 받은 두 수를 곱해서 반환해주세요.
반환하는 표현도 복소수 형태의 string 이어야 합니다.

복소수 정의에 의하면 (i^2)는 -1 이므로 (i^2) 일때는 -1로 계산해주세요.

제곱 표현이 안 되어 i의 2제곱을 (i^2)라고 표현했습니다.
예제 1:
Input: "1+1i", "1+1i"
Output: "0+2i"
설명:
(1 + i) * (1 + i) = 1 + i + i + i^2 = 2i
2i를 복소수 형태로 바꾸면 0+2i.

예제 2:
Input: "1+-1i", "1+-1i"
Output: "0+-2i"
설명:
(1 - i) * (1 - i) = 1 - i - i + i^2 = -2i,
-2i를 복소수 형태로 바꾸면 0+-2i.

예제 3:
Input: "1+3i", "1+-2i"
Output: "7+1i"
설명:
(1 + 3i) * (1 - 2i) = 1 - 2i + 3i -6(i^2) = 1 + i + 6,
7+i를 복소수 형태로 바꾸면 7+1i.

가정
input은 항상 a+bi 형태입니다.
output도 a+bi 형태로 나와야 합니다.

분석

복소수는 실수와 허수를 포함하고 있으므로 우선 이를 계산이 가능하도록 숫자로 뜯어내야 한다.
(a+bi) * (c+di) 인 경우 실수인 a, b, c, d를 뜯어 (a x c) + (a x di) + (bi x c) + (bi x di) 계산해야 한다. 마지막에선 i의 제곱이 나오므로 -1 곱셈처리 필요.

풀이

[첫번째 풀이]

def complex_number_multiply(a, b):  
  first = a.split('+')
  second = b.split('+')

  real = int(first[0]) * int(second[0]) \
         + (int((first[1].split('i'))[0]) * int((second[1].split('i'))[0]) * -1)
  fake = int(first[0]) * int((second[1].split('i'))[0]) + int((first[1].split('i'))[0]) \
         * int(second[0])

  return f"{real}+{fake}i" 

위 방식이 처음 내가 시도했던 방식이다. 옮바른 처리는 하나 계산식의 가독성이 떨어진다.

[python 기능을 이용한 개선된 풀이]

def complex_number_multiply(a,b):
    a1, a2 = map(int, a[:-1].split('i'))
    b1, b2 = map(int, b[:-1].split('i'))
    
    return "%d+%di" % ((a1 * b1) + (a2 * b2), (a1 * b2) + (a2 * b1))

python의 map 과 string format 기능을 이용하여 간소화한 소스

해석

이번 문제는 복소수 형태의 string 중 실수를 뽑아 계산하고 다시 복소수 string 으로 제공해야 하는 것이 핵심으로 python 기능을 이용해 얼마나 짧은 코드로 구현하느냐가 핵심이라 보임

profile
12년 .NET 개발 경력을 가진 웹 초짜 개발자입니다 :)

0개의 댓글

관련 채용 정보