Skip to content

Memoize #56

@hsskey

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
    }
  };

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions