Code-kata 11일차

임채현·2022년 1월 23일
0

복소수 계산을 실수와 허수부분을 따로 계산을 해서 합치는 원리를 생각하여 실수부분과 허수부분을 분리해주려 하였다. Number()를 사용하면 음수계산도 쉽게 할 수 있다. 복소수의 실수부분이 음수가 나오는 경우를 생각하여 다르게 slicing을 해주려 했다.

const numFront = (n) => {
  if (n[0] == '-') {
    return Number(n.split('').slice(0,2).join(''))
  }
  else {
    return Number(n[0])
  }
}

const numBack = (n) => {
  if (n[0] == '-') {
    return Number(n.split('').slice(2,4).join(''))
  }
  else {
    return Number(n.split('').slice(1,3).join(''))
  }
}

const complexNumberMultiply = (a, b) => {
  return `${numFront(a)*numFront(b) - numBack(a)*numBack(b)}+${numFront(a)*numBack(b) + numFront(b)*numBack(a)}i`
}

RunJS의 경우 계산이 잘되어서 당연히 test를 통과할 것이라 생각하였지만 실상은 그렇지 않았다.
내 위의 방식으로 복소수를 slicing하여 만든 함수는 실수와 허수부분이 한자리수 라는것을 가정하고 만든것이기 때문이다!!!
따라서 -12+150i와 같이 실수와 허수부분이 두자리나 세자리 혹은 그것을 넘어가는 경우에 대해서는 계산이 틀리게 된다.

나는 함수를 다시 만들어야했고 생각을 했다.
내가 생각하는 과정에서 발견한 중요한 포인트는 input이 무조건 +를 중심으로 실수부분과 허수부분을 나눈다는 것이다.
예를 들어 복소수가 -12-150i인 경우 input은 -12+-150i로 입력된다.
따라서 실수부분과 허수부분을 나누는 것을 +를 분기처리하여 for문을 돌리면 될것이라 생각하고 함수를 만들었다.

const frontNum = (n) => {
  let nArr = n.split('');
  let arr = []
  for (let i=0; i<n.indexOf('+'); i++) {
    arr.push(nArr[i])
  }
  return Number(arr.join(''))
}

const backNum = (n) => {
  let nArr = n.split('');
  let arr = []
  for (let i=n.indexOf('+')+1; i<n.length-1; i++) {
    arr.push(nArr[i])
  }
  return Number(arr.join(''))
}

const complexNumberMultiply = (a, b) => {
  return `${frontNum(a)*frontNum(b) - backNum(a)*backNum(b)}+${frontNum(a)*backNum(b) + frontNum(b)*backNum(a)}i`
}

이렇게 하면 -12-150i를 input으로 받아도 실수부분을 -12, 허수부분을 -150으로 분리해준다.
따라서 모든 경우에 대해서 복소수계산이 가능하다.

PS 동기분의 코드를 보고....!

n= '-12+150i'
n.split('+') // [-12, 150i]
Number(n.split('+')[0]) // -12
Number(n.split('+')[1].slice(0,-1)) // 150

+를 기준으로 split하면 내가 한 새로운 배열을 만드는 그런 과정을 모두 생략할 수 있다.
split의 인자에 '+'를 넣어주면 된다.
2개의 요소로 된 배열의 첫번째 요소는 실수부분이 되고 두번째 요소는 허수부분이 된다.
하지만 2번째 요소에서 i를 제거해주어야하기 때문에 -1까지 slicing해준다.

profile
열심히 살고 싶은 임채현입니다.

0개의 댓글