자료구조와 알고리듬 With Java/[프로그래머스] Algorithm

동적 계획법, 그리고 알고리즘

계란💕 2022. 3. 20. 19:07

1. 동적 계획법(Dynamic Programming, DP)

  - 특별한 속성을 가진 복잡한 문제를 푸는 방법

  - 단순한 하위 문제를 나눠서 푼다.

  Ex) 배낭 문제

  - 물품 하나가 추가될 때마다 경우의 수가 2배씩 늘어난다.

  - 시간복잡도: O(2^n)

 

2. 메모이제이션(memoization)

  - 계산 결과를 캐시에 저장해둔 뒤, 나중에 재사용하는 기법

    -> 처음 계산할 때, 그 결과를 캐시에 저장한다. 

  - 메모이제이션에 "배열"이 가장 적합하다.

    -> 배열은 매개변수에 대해 값을 저장할 수 있다.

  Ex) 메모이제이션을 사용한 피보나치 함수

<hide/>
public static int fibonacciRecursive(int number, int [] cache) {
		
		if(number <= 1) {
			return number;
		}
		
		if(cache[number] != 0) {
			return cache[number];
		}
		
		int ret = fibonacciRecursive(number - 2, cache) + fibonacciRecursive(number - 1, cache);
		cache[number] = ret;
		
		return ret;	
}

 

3. 동적 계획법과 메모이제이션의 차이점

  - 메모이제이션: 실행된 결과를 기억해뒀다가 재사용하는 최적화 기법

  - 동적 계획법: 복잡한 문제를 하위 문제로 쪼개서 재귀적으로 푸는 방법

    -> 동적 계획에서 메모이제이션이 자주 쓰인다.

 

4. top-down 동적 계획법

  - 최종적으로 풀려고 하는  복잡한 문제(루트)에서 시작한다.