-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Labels
Utility FunctionUtility Function ImplementationUtility Function Implementation
Description
문제 설명 | 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 (함수는 한 번만 호출됨)
- Output:
문제 해결 과정
Step 1: 문제 이해하기
- 작은 예시로 memoize 기능 이해하기
times10(5)함수를 memoize로 감싸면, 첫 번째 호출에만 실제 계산이 일어나고 이후에는 캐시된 결과를 반환- 다른 인자(예: 6)가 들어오면 새로 계산해야 함
Step 2: 접근 방법
-
직관적으로 생각하기
- 함수의 결과를 저장할 캐시(Map)가 필요함
- 인자를 키로 사용하여 결과를 저장하고 검색해야 함
- 객체 타입 인자도 처리하기 위해 JSON.stringify를 사용하여 키를 생성
-
알고리즘 표 작성
1. 캐시 객체 생성 (Map) 2. 새 함수 반환 (클로저 활용) 3. 호출 시: ↓ 인자들을 문자열 키로 변환 ↓ 캐시에 키가 있는지 확인 ↓ 있다면 -> 캐시된 결과 반환 없다면 -> 원본 함수 호출, 결과 캐시에 저장 후 반환
Step 3: 코드 설계
- 캐시를 저장할 Map 객체 생성
- 원본 함수를 참조하는 새로운 함수 반환
- 새 함수에서:
- 인자들을 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
Labels
Utility FunctionUtility Function ImplementationUtility Function Implementation