티스토리 뷰
📌다이내믹 프로그래밍
큰 문제를 작게 나누고, 같은 문제라면 한 번씩만 풀어 문제를 효율적으로 해결하는 알고리즘
컴퓨터는 연산 속도에 한계, 메모리 공간을 사용할 수 있는 데이터의 개수도 한정적이기 때문에 연산 속도와 메모리 공간을 최대한으로 활용할 수 있는 효율적인 알고리즘 작성해야 함
하지만 다이나믹 프로그래밍 기법을 통해 메모리 공간을 약간 더 사용하면 연산 속도 비약적으로 증가 시킬 수 있는 문제도 존재
📌다이내믹 프로그래밍 사용 조건
1. 큰 문제를 작은 문제로 나눌 수 있다.
2. 작은 문제에서 구한 정답은 그것을 포함하는 큰 문제에서도 동일하다.
📌메모이제이션 기법
다이나믹 프로그래밍을 구현하는 방법 중 하나
한번 구한 결과를 메모리 공간에 메모해두고 같은 식을 다시 호출하면 메모한 결과를 그대로 가져오는 기법
캐싱이라고도 함
한 번 구한 정보를 리스트에 저장하는 방식으로 구현
다이나믹 프로그래밍을 재귀적으로 수행하다가 같은 정보가 필요할 때는 이미 구한 정답을 그대로 리스트에서 가져오면 됨
📌피보나치 수열 코드(탑다운)
# 한 번 계산된 결과를 메모이제이션하기 위한 리스트 초기화
d = [0] * 100
# 피보나치 함수를 재귀함수로 구현(탑다운 다이나믹 프로그래밍)
def fibo(x):
# 종료 조건
if x == 1 or x == 2:
return 1
# 이미 계산한 적 있는 문제라면 그대로 반환
if d[x] != 0:
return d[x]
# 아직 계산하지 않은 문제라면 점화식에 따라서 피보나치 결과 반환
d[x] = fibo(x - 1) + fibo(x - 2)
return d[x]
print(fibo(99))
📌탑다운, 보텀업 방식
탑다운 방식(하향식): 재귀 함수를 이용하여 다이나믹 프로그래밍 소스코드를 작성하는 방법, 큰 문제를 해결하기 위해 작은 문제를 호출
보텀업 방식(상향식): 반복문을 이용하여 다이나믹 프로그래밍 소스코드를 작성하는 방법, 작은 문제부터 차근차근 답을 도출
📌피보나치 수열 코드(보텀업)
# DP 테이블 초기화
d = [0] * 100
d[1] = 1
d[2] = 1
n = 99
# 피보나치 함수 반복문으로 구현(보텀업 다이나믹 프로그래밍)
for i in range(3, n + 1):
d[i] = d[i - 1] + d[i - 2]
print(d[n])
📌참고
https://www.tistory.com/event/write-challenge-2024