Skip to content

Memoize #56

Description

@hsskey

문제 설명 | Memoize 함수 구현

함수의 결과를 캐싱하여 동일한 인자로 함수가 다시 호출될 때 이전에 계산된 결과를 반환하는 memoize 함수를 구현합니다.

📝 제약조건

  • 함수는 어떤 타입의 인자든 처리할 수 있어야 함
  • 캐시는 동일한 인자에 대해 함수를 한 번만 호출하도록 해야 함
  • 캐시 키는 모든 인자를 고려해야 함

💡 예시

  • Input:
    let callCount = 0;
    const times10 = (n) => {
      callCount++;
      return n * 10;
    };
    const memoized = memoize(times10);
    memoized(5);          // 첫 번째 호출
    memoized(5);          // 두 번째 호출
    • Output:
      • 첫 번째 호출: 50 (계산됨)
      • 두 번째 호출: 50 (캐시에서 가져옴)
      • callCount: 1 (함수는 한 번만 호출됨)

문제 해결 과정

Step 1: 문제 이해하기

  • 작은 예시로 memoize 기능 이해하기
    • times10(5) 함수를 memoize로 감싸면, 첫 번째 호출에만 실제 계산이 일어나고 이후에는 캐시된 결과를 반환
    • 다른 인자(예: 6)가 들어오면 새로 계산해야 함

Step 2: 접근 방법

  • 직관적으로 생각하기

    • 함수의 결과를 저장할 캐시(Map)가 필요함
    • 인자를 키로 사용하여 결과를 저장하고 검색해야 함
    • 객체 타입 인자도 처리하기 위해 JSON.stringify를 사용하여 키를 생성
  • 알고리즘 표 작성

    1. 캐시 객체 생성 (Map)
    2. 새 함수 반환 (클로저 활용)
    3. 호출 시:
       ↓
       인자들을 문자열 키로 변환
       ↓
       캐시에 키가 있는지 확인
       ↓
       있다면 -> 캐시된 결과 반환
       없다면 -> 원본 함수 호출, 결과 캐시에 저장 후 반환
    

Step 3: 코드 설계

  1. 캐시를 저장할 Map 객체 생성
  2. 원본 함수를 참조하는 새로운 함수 반환
  3. 새 함수에서:
    • 인자들을 JSON.stringify로 문자열 키로 변환
    • 캐시에서 키 검색
    • 있으면 캐시된 결과 반환
    • 없으면 원본 함수 호출하고 결과를 캐시에 저장

Step 4: 코드 구현

const memoize = (func) => {
    const cache = new Map()
    return function(...args) {
        const key = JSON.stringify(args)
        
        if(cache.has(key)){
            return cache.get(key)
        }

        const result = func.apply(this, args)
        cache.set(key, result)
        
        return result
    }
  };

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions