hgk0404.tistory
Code After Work
hgk0404.tistory

공지사항

  • 블로그
전체 방문자
오늘
어제
  • 전체 카테고리
    • [컴퓨터비전]
    • [MLOps]
      • [FastAPI]
    • [Computer Science]
      • [컴퓨터네트워크]
      • [알고리즘]
      • [자료구조 in C]
      • [C & C++]
      • [이산수학]
      • [Math]
    • [머신러닝]
      • [Numpy, Pandas]
    • [Cloud]
      • [AWS]
      • [NCP]
      • [Kubernetes]
      • [Terraform]
    • [Dev]
      • [가상환경]
      • [Linux]
      • [Docker]
    • [Python]
    • [Coding Test]
      • [백준]
      • [프로그래머스]
      • [SQL]
    • [WEB]
    • [일상]
    • [엑셀]
    • [금융]

인기 글

최근 글

최근 댓글

250x250
hELLO · Designed By 정상우.
hgk0404.tistory

Code After Work

[Algorithm] 다이나믹 프로그래밍(DP) - 탑다운, 바텀업
[Computer Science]/[알고리즘]

[Algorithm] 다이나믹 프로그래밍(DP) - 탑다운, 바텀업

2022. 7. 14. 21:51
728x90

컴퓨터의 연산 속도에는 한계가 있고 그 속도를 단축 시켜줄 방법이 필요합니다. 연산속도와 메모리 공간을 효율적으로 활용할 수 있는 알고리즘 방법이 있습니다.

 

다이나믹 프로그래밍 우리말로는 동적 계획법이라고 불리우는 알고리즘입니다. 다이나믹 프로그래밍을 이용하여 풀 수 있는 문제를 알아보겠습니다.

 

피보나치 수열 : 인접 한 두 수를 더해서 다음 수를 구하는 수열

 

1 1 2 3 5 8 13 21 34 55 89.... 

 

피보나치 수열 코드

def fibo(x):
    if x == 1 or x == 2:
        return 1
    else:
        return fibo(x-2) + fibo(x-1)
print(fibo(10))

 

결과)

55

 

10을 수행하는데 시간이 조금 걸린다. 더 빠르게 수행하기 위해 다이나믹 프로그래밍을 사용할 수 있다.

 

f(3)이 여러번 호출되는 것을 알 수 있는데 다이나믹 프로그래밍의 메모이제이션을 이용하면 호출횟수를 줄여서 속도를 높일 수 있습니다.

 

큰 문제를 작은 문제로 나누고 작은 문제는 큰 문제에서도 동일한 값을 가집니다.

 

피보나치 수열 재귀적방법(탑 다운)

dp = [0]*100

def fibo(n):
    if n == 1 or n == 2:
        return 1
    if dp[n] != 0:
        return dp[n]
    dp[n] = fibo(n-1) + fibo(n-2)
    return dp[n]
print(fibo(99))

 

결과)

218922995834555169026

 

dp를 사용하니 금방 결과가 출력되었습니다.

 

이렇게 재귀함수를 이용하여 큰 문제에서 작은 문제의 값을 찾아가서 다시 되돌아오는 방식을 탑다운(top-down) 방식이라고 부릅니다. 다른 말로 하향식이라고도 부릅니다.

 

하지만 재귀함수 대신 반복문을 사용하여 dp를 구현하는 경우가 있습니다. 이런 경우를 바텀업(bottom-up) 방식이라고 부릅니다.

 

반복문을 사용한 방식이 재귀함수를 사용한 방식보다 성능이 조금 더 좋다고 합니다. 피보나치 수열로 알아보겠습니다.

 

피보나치 수열 반복적방법(바텀업)

dp = [0]*100 #1
n = 99
dp[1] = 1
dp[2] = 1
for i in range(3, n+1):
    dp[i] = dp[i-2] + dp[i-1]
print(dp[n])

 

#1 : 결과 저장용 리스트(DP 테이블)

 

결과)

218922995834555169026

 

작은수 3부터 시작해서 n까지 채워서 올라가는 방식이므로 바텀업(bottom-up) 방식이라고 부릅니다. 다른 말로 상향식이라고도 부릅니다.

 

 

728x90
저작자표시 동일조건 (새창열림)

'[Computer Science] > [알고리즘]' 카테고리의 다른 글

[Algorithm] monotone stack 알고리즘  (0) 2022.07.23
[Algorithm] BackTracking(백트래킹) 알고리즘  (0) 2022.07.16
[Algorithm] 다익스트라 알고리즘  (0) 2022.07.11
[Algorithm] 플로이드 워셜 알고리즘  (0) 2022.07.10
[Algorithm] 0-1 BFS  (0) 2022.07.08
'[Computer Science]/[알고리즘]' 카테고리의 다른 글
  • [Algorithm] monotone stack 알고리즘
  • [Algorithm] BackTracking(백트래킹) 알고리즘
  • [Algorithm] 다익스트라 알고리즘
  • [Algorithm] 플로이드 워셜 알고리즘
hgk0404.tistory
hgk0404.tistory
공부기록

티스토리툴바