1. 메모이제이션?

**메모이제이션(Memoization)**은 컴퓨터 프로그램의 성능을 향상시키기 위한 최적화 기법입니다. 이는 이미 계산된 결과를 저장(메모)하고 재사용하여 동일한 계산을 반복하지 않도록 합니다. 메모이제이션은 주로 고비용의 계산과 상호 작용하는 컴퓨터 알고리즘을 개선하는 데 사용됩니다.

메모이제이션의 장점:

시간 복잡도 감소: 결과를 저장하여 계산 시간을 줄임.코드의 간결성과 가독성 향상: 적절한 메모이제이션 기법을 사용함으로써 함수 구현이 간결해질 수 있음.

메모이제이션의 단점:

메모리 사용량 증가: 결과를 저장하는 데 메모리 공간이 필요하므로, 메모리 사용량에 영향을 줌.어떤 애플리케이션에서는 메모이제이션의 실제 성능 향상이 미비할 수도 있음. 이는 애플리케이션의 특성과 입력 데이터의 분포에 따라 다를 수 있음.

function factorial(n) {
  if (Number.isInteger(n) && n > 0) {
    if (!(n in factorial)) {
      factorial[n] = n * factorial(n - 1);
    }
    return factorial[n];
  } else {
    return '잘못된 숫자가 입력되었습니다.';
  }
}

factorial[1] = 1; // 캐시를 초기화합니다.
factorial(6); // => 720
factorial[5]; // => 120 / 이 값은 이미 캐시에 존재합니다.
  1. factorial(n) 함수를 정의합니다. 매개변수 n은 팩토리얼을 구할 정수입니다.
  2. 함수 내부에서 if (Number.isInteger(n) && n > 0) 조건문을 사용해 입력받은 n이 양의 정수인지 확인합니다.
  3. n이 양의 정수인 경우, 이전에 계산되어 캐시에 저장되었는지 확인합니다. 만약 캐시에 저장된 값이 없다면 (!(n in factorial)), 팩토리얼 함수를 재귀적으로 호출하여 n의 팩토리얼 값을 계산하고, 캐시에 저장합니다(factorial[n] = n * factorial(n - 1)).
  4. factorial[n]을 반환하여 팩토리얼 값을 반환합니다. 캐시에 이미 해당 값이 저장되어 있다면, 저장된 값을 바로 반환하여 재사용합니다. 이를 통해 성능이 개선됩니다.
  5. n이 양의 정수가 아닐 경우, '잘못된 숫자가 입력되었습니다.'를 반환합니다.
  6. factorial[1] = 1; 코드를 사용해 캐시를 초기화하고, 1의 팩토리얼 값을 캐시에 저장합니다. 이는 팩토리얼 함수의 기본 케이스이므로 첫 번째 값으로 캐시에 저장해둡니다.

예시 코드 실행:

  1. factorial(6);을 호출하여 팩토리얼 값을 구합니다. 이는 6 * 5 * 4 * 3 * 2 * 1 = 720이며, 계산된 팩토리얼 값이 캐시에 저장됩니다.
  2. factorial[5];를 조회하여 저장된 값을 확인할 수 있습니다. 이미 캐시에 저장된 값인 5 * 4 * 3 * 2 * 1 = 120이 반환됩니다. 팩토리얼 함수를 다시 호출할 필요 없이 저장된 값을 사용할 수 있습니다.