Memoization (메모이제이션)

2025. 1. 9. 15:05·Algorithm/내용 정리

 

❐ Description


[LeetCode#198. House Robber] 문제를 풀면서 메모이제이션 방식에 능숙하지 않음을 파악했고,

간단한 예제와 함께 두 가지(top-down / bottom-up) 방식을 숙달하자. 

 

 

 

 

 

❐ 메모이제이션이란?


메모이제이션(memoization)은 컴퓨터 프로그램이 동일한 계산을 반복해야 할 때, 이전에 계산한 값을

메모리에 저장함으로써 동일한 계산의 반복 수행을 제거하여 프로그램 실행 속도를 빠르게 하는 기술이다. 

특히 동적계획법(DP)의 핵심이 되는 기술이다. 주로 배열 또는 맵을 이용해서 결과를 저장한다. 

 

 

 

 

 

❐ 구현하는 두 가지 방식


1. Top-Down (하향식)

재귀 기반의 접근으로, 문제를 더 작은 하위 문제로 나누어 풀어가며, 이미 계산한 결과를 저장하고 재사용한다.

 

👍 장점 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

  • 이해하기 쉽고, 코드가 간경하게 작성된다.
  • 필요한 부분만 계산하므로, 경우에 따라 불필요한 계산을 줄일 수 있다.

 

👎 단점 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

  • 재귀 호출 스택이 깊어질 수록 스택 오버플로우가 발생할 수 있다.
  • 캐싱을 위한 추가 메모리가 필요하다.

 

🧩 예제 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

피보나치 수열을 Top-Down 방식으로 구현해봤다.

public class TopDown {
    
    private static int[] memo;
    
    public int fibonacci(int n) {
        if (n <= 1) return n;
        if (memo[n] != -1) return memo[n];
        // Top ➔ Down
        return memo[n] = fibonacci(n - 1) + fibonacci(n - 2);
    }
    
    public static void main(String[] args) {
        int n = 10;
        memo = new int[n + 1];
        Arrays.fill(memo, -1); // 메모이제이션 배열 초기화

        TopDown topDown = new TopDown();
        topDown.fibonacci(n);
    }
}

 

 

2. Bottom-Up (상향식)

반복문 기반의 접근으로, 작은 문제를 먼저 계산하여 더 큰 문제를 해결하는 방식이다.

 

👍 장점 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

  • 스택 오버플로우 문제가 발생하지 않는다.
  • 재귀 호출이 없기 때문에 함수 호출 오버헤드가 없다.

 

👎 단점 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

  • 모든 하위 문제를 계산해야 하므로, 불필요한 계산이 포함될 가능성이 있다.
  • 초기화를 포함해 코드가 Top-Down 보다 조금 복잡할 수 있다.

 

🧩 예제 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

피보나치 수열을 Bottom-Up 방식으로 구현해봤다.

public int fibonacci(int n) {
    if (n <= 1) return n;

    int[] dp = new int[n + 1];
    dp[0] = 0;
    dp[1] = 1;

    // Bottom ➔ Top
    for (int i = 2; i <= n; i++) {
        dp[i] = dp[i - 2] + dp[i - 1];
    }
    return dp[n];
}

 

 

 

 

 

❐ 198. House Robber 풀어보기


  • [LeetCode#198] House Robber 문제풀이 포스팅

 

 

 

 

 


'Algorithm > 내용 정리' 카테고리의 다른 글

LCS 알고리즘  (0) 2025.03.23
Counting Sort  (0) 2025.01.21
Binary Search는 꼭 정렬된 배열에서만 사용해야 할까?  (0) 2025.01.06
Manacher 알고리즘  (0) 2024.12.15
Back Tracking  (0) 2024.11.20
'Algorithm/내용 정리' 카테고리의 다른 글
  • LCS 알고리즘
  • Counting Sort
  • Binary Search는 꼭 정렬된 배열에서만 사용해야 할까?
  • Manacher 알고리즘
gilbert9172
gilbert9172
gilbert9172 님의 블로그 입니다.
  • gilbert9172
    バックエンド
    gilbert9172
  • 전체
    오늘
    어제
    • All Categories (175)
      • 우테코 7기 (21)
        • 1주차 (8)
        • 2주차 (5)
        • 3주차 (6)
      • Langauge (4)
        • Java (3)
        • Kotlin (1)
      • Back-End (13)
        • SpringBoot (1)
        • Trouble Shooting (0)
        • Setup & Configuration (1)
        • SQL (3)
        • Redis (8)
      • Architecture (6)
        • Multi Module (1)
        • DDD (5)
      • CS (30)
        • Data Structure (6)
        • Operating System (0)
        • Network (12)
        • Database (10)
        • Design Pattern (2)
      • Algorithm (78)
        • 내용 정리 (18)
        • 문제풀이 (60)
      • DevOps (6)
        • AWS (5)
        • Git (1)
      • Front-End (1)
        • Trouble Shooting (1)
      • Project (6)
        • 페이스콕 (6)
      • Book (9)
        • 이벤트 기반 마이크로서비스 구축 (7)
        • 친절한 SQL 튜닝 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    sliding-window
    Back-Tracking
    Two-Pointer
    binarysearch
    오블완
    부분단조성
    greedy
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
gilbert9172
Memoization (메모이제이션)
상단으로

티스토리툴바