여니의 취준 준비/알고리즘 기본 개념

[Chapter8] 다이나믹 프로그래밍

여니's 2021. 2. 19. 19:26

참고 출처 : 이것이 코딩테스트다 with 파이썬


다이나믹 프로그래밍 

: 동적 계획법

 

피보나치 수열은 재귀함수로도 구현이 가능하지만, 

숫자가 커질수록 연산수가 늘어남..

 

그래서 피보나치 수열은 보통 다이나믹 프로그래밍을 사용해서 구현함.

항상 다이나믹 프로그래밍을 사용할 수 있는 것은 아니다.

 

다음 조건을 만족할 때만 다이나믹 프로그래밍을 사용할 수 있다.

1. 큰 문제를 작은 문제로 나눌 수 있다.

2. 작은 문제에서 구한 정답은 그것을 포함하는 큰 문제에서도 동일하다.

 

피보나치 수열을 메모이제이션 기법을 사용해서 해결하기

(메모이제이션은 다이나믹 프로그래밍 구현 방법 중 하나이다.)

=> 메모이제이션 기법은, 한 번 구한 결과를 메모리 공간에 메모해두고 같은 식을 다시 호출하면

메모한 결과를 그대로 가져오는 기법을 의미하는데, 

메모이제이션은 값을 저장하는 방법이므로 캐싱이라고도 한다.

 

방법은 매우 간단하다

한 번 구한 정보를 리스트에 저장하면 끝!

재귀 함수를 이용하여 다이나믹 프로그래밍 소스 코드를 작성하는 방법을

탑다운 방식이라고 하고,

단순히 반복문을 이용하여 작성하는 경우에는 

작은 문제부터 차근차근 답을 도출한다고 하여 보텀업 방식이라고 한다.


다이나믹 프로그래밍이란?

=> 큰 문제를 작게 나누고, 같은 문제라면 한 번씩만 풀어 문제를 효율적으로 해결하는 기법을 의미한다.

 


가능하다면,

재귀함수를 이용하는 탑다운 방식보다는 보텀업 방식으로 구현하기

(재귀 함수 깊이와 관련된 오류가 발생할 수 있기에)

이 오류는 sys 라이브러리에 포함되어 있는,

setrecursionlimit() 함수를 호출해서 재귀 제한을 완화할 수 있음

 

보텀업 방식 (반복문 사용)