06. 다이나믹 프로그래밍

ji-vvon·2021년 8월 2일
2

알고리즘(파이썬)

목록 보기
31/41

👩‍🏫 다이나믹 프로그래밍

-> '다이나믹' 프로그래밍 != '동적' 할당

- 다이나믹 프로그래밍의 조건

👩‍🏫 피보나치 수열

- 소스 코드

# 피보나치 함수(Fibonacci Function)을 재귀함수로 구현
def fibo(x):
    if x == 1 or x == 2:
        return 1
    return fibo(x - 1) + fibo(x - 2)

print(fibo(4))

- 시간 복잡도

- 해법

- 메모리제이션(캐싱)

- 탑다운 VS 보텀업

- 소스 코드(탑다운)

# 한 번 계산된 결과를 메모이제이션(Memoization)하기 위한 리스트 초기화
d = [0] * 100

# 피보나치 함수(Fibonacci Function)를 재귀함수로 구현 (탑다운 다이나믹 프로그래밍)
def fibo(x):
    # 종료 조건(1 혹은 2일 때 1을 반환)
    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

# 첫 번째 피보나치 수와 두 번째 피보나치 수는 1
d[1] = 1
d[2] = 1
n = 99

# 피보나치 함수(Fibonacci Function) 반복문으로 구현(보텀업 다이나믹 프로그래밍)
for i in range(3, n + 1):
    d[i] = d[i - 1] + d[i - 2]

print(d[n])

- 동작 분석

- 시간 복잡도

다이나믹 프로그래밍 VS 분할정복

- 다이나믹 프로그래밍 문제 접근법


'이것이 코딩 테스트다 with 파이썬(나동빈)' 책과 이코테 유튜브 강의 영상을 기반으로 작성한 글입니다.

2개의 댓글

comment-user-thumbnail
2021년 8월 3일

안녕하세요, 김덕우입니다. 다이나믹 프로그래밍 정리해주신 거 잘 읽고 갑니다. 이번주도 같이 화이팅 해봐요!!

답글 달기
comment-user-thumbnail
2021년 8월 3일

안녕하세요! 다이나믹 프로그래밍 영상이 꽤나 길더라구요:)
요약정리를 잘해주셔서 저도 한번 더 공부하고 갑니다
이번주도 힘내요!

답글 달기