Code Kata | Review (6)

woongstaa·2021년 12월 19일
0

알고리즘

목록 보기
6/14
post-thumbnail

문제_1

두 개의 input에 복소수(complex number)가 string 으로 주어집니다.
복소수란 a+bi 의 형태로, 실수와 허수로 이루어진 수입니다.
input으로 받은 두 수를 곱해서 반환해주세요. 반환하는 표현도 복소수 형태의 string 이어야 합니다.
복소수 정의에 의하면 (i^2)는 -1 이므로 (i^2) 일때는 -1로 계산해주세요.
(제곱 표현이 안 되어 i의 2제곱을 (i^2)라고 표현했습니다.)

Input: "1+1i", "1+1i"
Output: "0+2i
(1 + i) (1 + i) = 1 + i + i + i^2 = 2i
2i를 복소수 형태로 바꾸면 0+2i

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

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

풀이

const complexNumberMultiply = (a, b) => {

  let arrayA = a.split('+'); // (1)
  let arrayB = b.split('+');
  let arrayProduct = []; // (2)
  
  for (let i = 0; i < arrayA.length; i++) { // (2)
    for (let j = 0; j < arrayB.length; j++) {
      arrayProduct.push(parseInt(arrayA[i]) * parseInt(arrayB[j]));
    }
  }
  return `${arrayProduct[0] + arrayProduct[3] * -1}+${arrayProduct[1] + arrayProduct[2]}i` // (3)
}

곱셈공식을 활용해 처음 값은 자연수, 두번째 세번째 값은 i가 붙은 값, 네번째 값은 i의 제곱이 -1이기 때문에 곱하기 -1을 해준다.

(1) 상수로 들어오는 값이 "1 + -1i" 처럼 음수가 나오기 때문에 우선 '+' 기준으로 값을 잘라준 뒤

(2) 반복문을 통해 곱셈 공식의 각각의 자리에 해당하는 값을 빈 배열에 넣어준다. i가 붙은값도 parseInt 메서드를 사용하면 같이 곱해지기 때문에 문제없이 연산할 수 있다.

(3) 그렇게 빈 배열에 4개의 값이 들어 있을텐데 그것을 곱셈공식처럼 재구축해서 반환해주면 문제를 풀 수 있다.

문제_2

문자로 구성된 배열을 input으로 전달하면, 문자를 뒤집어서 return 해주세요.
새로운 배열을 선언하면 안 됩니다.
인자로 받은 배열을 수정해서 만들어주세요.

Input: ["h", "e", "l", "l", "o"]
Output: ["o", "l", "l", "e", "h"]

Input: ["H", "a", "n", "n", "a", "h"]
Output: ["h", "a", "n", "n", "a", "H"]

풀이

const reverseString = s => {
  for(i = s.length-1; i >= 0; i--) { // (1)
    s.push(s[i]); 
  }
  s.splice(0, s.length/2) // (2)
  return s
};

해당 문제는 reverse 매서드를 활용한다면 간단히 풀 수 있지만, 다른 방법으로도 한 번 풀어보았다.

(1) 우선 반복문을 돌리는데 범위를 역순으로 설정하였다. 그 이유는 (2)에서 설명하도록하고, 역순으로 돌면서 값을 하나씩 배열의 뒤로 하나씩 추가 해준다. ["h", "e", "l", "l", "o"] => ["h", "e", "l", "l", "o", "o", "l", "l", "e", "h"]

(2) 그 값을 잘라주는데 splice 매서드는 index 기준으로 작동하기 때문에, 첫 시작인 0부터 현재 s배열의 길이의 반값까지만 잘라주는 것이다. 이 매서드를 사용하기 위해 반복문을 역순으로 돌려야만 했다.

문제_3

주어진 숫자 배열에서, 0을 배열의 마지막쪽으로 이동시켜주세요. 원래 있던 숫자의 순서는 바꾸지 말아주세요.
(새로운 배열을 생성해서는 안 됩니다.)

Input: [0,1,0,3,12]
Output: [1,3,12,0,0]

풀이

const moveZeroes = nums => {
  for (i = nums.length-1; i >= 0; i--) {
    if (nums[i] === 0) {
      nums.push(nums[i])
      nums.splice(i,1)
    }
  }
  return nums
}

이번 문제는 처음부터 간단하게 배열을 순회하면서 0을 찾으면, 0을 지우고 0을 기존 배열의 뒤로 넣어주면 되겠다고 생각했었다.

하지만 이렇게 풀게 되면 배열에서 값이 0인 값을 만났을때 위 과정을 수행하게 됐을때, 그 다음 Index의 값을 순회하지 못하게 되어 완벽하게 풀 수 없었다.

ex) i = 0, [0, 0, 1, 3, 12] ⇒ [0, 1, 3, 12, 0]
i = 1, [0, 1, 3, 12, 0] ⇒ [0, 1, 3, 12, 0]

이를 해결하기위해 뒤에서부터 반복문을 돌리게 되면, index값이 변동되도 영향이 받지않기 때문에 완벽하게 해결할 수 있게 되었다.

문제_4

재귀를 사용하여 팩토리얼(factorial)을 구하는 함수를 구현해주세요. 팩토리얼이란 1에서부터 n까지의 정수를 모두 곱한것을 말합니다.

풀이

const factorial = n => {
  if (n === 0) return 1
  return n * factorial(n - 1)
  countdown(n - 1);
}

이 문제는 재귀 함수를 활용하는 문제다.
팩토리얼이라는 개념이 재귀 함수에 딱 맞는 예시 중 하나이기 때문에, 간단하게 풀 수 있었다.

if문으로 0이 됐을때 멈추도록 하면서 값을 1을 주어 결과 값을 숫자로 유지하면 된다.

0개의 댓글