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