code-kata(Week3 - Day1)(TIL)

이해용·2022년 5월 28일
0
post-thumbnail

문제

두 개의 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의 값이 복소수로 (x+yi) 의 값이 들어오고 b의 복소수 값이 (c+di) 라는 것을 알게 되니 두 값을 곱했을 때 나오는 복소수의 형태를 넣어주면 되겠다는 생각을 했다.

a와 b의 값이 들어왔을 때 우선 나눠줘야 하기 때문에 split method를 사용하게 되었는데 여기서 "+" 의 값으로 나누고 싶으면 a.split("+")을 사용하면 된다는 것을 알게 되었다.

let x = a.split("+");  
let c = b.split("+");

그리고 나눠진 x의 배열과 c의 배열에서 두번째 값은 i가 무조건 포함되어있으니 숫자만 나눠질 수 있도록 i를 split하여 나눠준다.

let y = x[1].split("i");
let d = c[1].split("i");

선언한 x, y, c ,d 를 활용하여 실수 값은 실수 값끼리 계산해주고 허수 값은 허수 값끼리 계산을 해준다. 또한, 처음 입력된 값은 문자열이나 숫자로 변경할 값에 *를 사용한다면 숫자로 자동 변경된다.

let real = (x[0]*d[0]) - (c[0]*y[0]); // 실수의 값 결과
let imaginary = (x[0]*d[0]) + (y[0]*c[0]); // 허수의 값 결과

그리고 변경한 숫자를 문자열로 변경해야하기 때문에 toString() 응 사용한다.

let result1 = real.toString()
let result2 = imaginary.toString()

최종 return되야하는 값의 형태를 a+bi로 나타나게 해준다.

return `${result1}+${result2}i`

최종 결과

const complexNumberMultiply = (a, b) => { 
  let x = a.split("+");  
  let y = x[1].split("i");
  let c = b.split("+");
  let d = c[1].split("i");

  let real = (x[0]*d[0]) - (c[0]*y[0]);
  let imaginary = (x[0]*d[0]) + (y[0]*c[0]);
  
  let result1 = real.toString()
  let result2 = imaginary.toString()
  
  return `${result1}+${result2}i`  
}

출처 및 참고
https://velog.io/@rebreather/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84-%EC%88%AB%EC%9E%90%EB%A1%9C-%EB%B3%80%ED%99%98%ED%95%98%EA%B8%B0-parseInt-parseFloat-%EC%97%B0%EC%82%B0%EC%9E%90

profile
프론트엔드 개발자입니다.

0개의 댓글