<코드타카 3주 차 01.>

강민수·2021년 12월 19일
0

Day 1

문제

두 개의 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인데, 그것을 두 개를 곱해야 하는 형식이다.

하지만, 여기서 두 인자가 i가 스트링이고, 이것을 숫자처럼 하기 위해서는 i와 같은 문자열을 분리시키는 것이 좋다는 생각이 들었다.

그래서 아래와 같이 2가지 형식으로 풀어봤다.

풀이1.

const complexNumberMultiply = (a, b) => {
// 여기에 코드를 작성해주세요.
//a와b에는 공통적으로 +와 i가 있다 그걸 slice로 쪼개고 split의 +기준으로 배열에는 숫자만 들어가게 만들어준다.
let arrA = a.slice(0, -1).split('+') 
let arrB = b.slice(0, -1).split('+')
//숫자만 들어간걸 다시 배열로 만들어준다
let array = [...arrA, ...arrB]
console.log(array)

//이제 인수분해 하듯이 연산한다.
let calcArr = []
//마지막에 -1이 들어간것은 마지막은 i^2이 되기 때문이다
calcArr.push((array[0] * array[2]) + (array[1] * array[3] * -1))// 여기서 -1은 i의 제곱근. 
//그리고 다시 인수분해 연산으로 만들어준다
calcArr.push(array[0] * array[3] + array[1] * array[2])

//마지막으로 calcArr의 0번째와 1번째를 더해서 마지막에 i를 붙여준다
let result = `${calcArr[0]}+${calcArr[1]}i`
return result

}
console.log(complexNumberMultiply("1+1i", "1+1i"))

module.exports = { complexNumberMultiply };

이처럼 이 문제의 핵심은 아이를 어떻게 분리 시키느냐에 달려 있다. 따라서 위처럼 슬라이스와 스플라이스를 통해 숫자만 들어간 배열로 만들어 준다. 이때 깊은 복사가 쓰였다. 그리고 다시 콘솔을 찍어 보면 다음과 같이 나온다.

이후에는 인수분해 하듯이 배열의 인자별로 연산을 해주면 끝이 난다. 그리고 마지막에는 숫자를 문자 취급해 주기만 하면 답에서 요구하는 형식인 복소수 형태의 문자가 나온다.

풀이2.

const complexNumberMultiply = (a, b) => { 
  // a="1+2i" b="1-2i" 라면,
  // 여기에 코드를 작성해주세요.
  let aNumArr=a.split('+').map(e=>parseInt(e)) 
  // [1,2] 와 같은 형식의 배열
  let bNumArr=b.split('+').map(e=>parseInt(e)) 
  // [1,-2] 와 같은 형식의 배열

  let first = aNumArr[0]*bNumArr[0]-aNumArr[1]*bNumArr[1] 
  // 실수 부분
  let second = aNumArr[1]*bNumArr[0]+aNumArr[0]*bNumArr[1] 
  // 허수 부분
 
  return first+"+"+second+"i" 
  // 요구하는 문자열 형태로 반환
}

이 풀이에서는 팔스 인트를 통해서 애초에 위의 풀이와 달리 훨씬 깔끔하게 가능했다. 이때, 여기서 팔스인트가 문자열인 i를 무시하고 자동적으로 안의 숫자만 바로 뽑아서 배열로 변환하는 메서드라는 것을 처음 알았다. 그래서 이후에는 기존처럼 실수와 허수로 나눠서 인수분해 형식으로 풀기만 하면 끝 난다.

문제 풀이를 통해 2가지 방식중 어는 것이 더 낫다고 볼 수는 없지만, 확실히 문제마다 사고 과정에서 핵심이 되는 부분이 존재한다는 생각이 들었다. 이번 경우에는 문자열을 배제하고 숫자끼리만 계산시키는 과정이 필요한 것처럼 말이다. 추가적으로 몰랐던 메소드에 대해 조금 더 기능과 역할에 대해 더 자세히 살펴볼 필요성을 느꼈다.

profile
개발도 예능처럼 재미지게~

0개의 댓글