[알고리즘 개념] 동적 계획법 (Dynamic Programming) -(1)

2022. 7. 19. 22:37·Algorithm/알고리즘
728x90
728x90

인프런 강의 참고

동적 계획법 (Dynamic Programming) 이란

(출처 나무위키)

 

  • 동적 계획법이란 특정 범위까지의 값을 구하기 위해서 그것과 다른 범위까지의 값을 이용하여 효율적으로 값을 구하는 알고리즘 이다.
  • 즉, 답을 재활용!! 한다고 생각하면 쉽다.
  • 기본적으로 분할 정복 알고리즘과 비슷하다.
  • 동적 계획법은 계산 횟수를 줄일 수 있다. 특히 이 방법은 하위 문제의 수가 기하급수적으로 증가할 때 유용하다.

+동적 계획법을 영문으로는 다이나믹 프로그래밍(dynamic programming)이라 표기하는데, 이름과는 달리 딱히 다이나믹하지도 않고 프로그래밍이라는 단어와도 큰 연관이 없다.

 

 

예시

 

피보나치 수열

//재귀함수를 이용한 피보나치 수열 함수
int fib(int n)
{
	if (n == 1 || n == 2)
		return 1;
	else
		return fib(n - 2) + fib(n - 1);
}

하지만 이 방법은 많은 계산이 중복되기 때문에 효율적이지 않다.

피보나치 수열

방법1: Memoization (메모이제이션)

값을 저장해두고 재활용하는 방식이다,

int fib(int n)
{
	if (n == 1 || n == 2)
		return 1;
	else if (f[n] > -1)  //f[n] 이 -1보다 크다는 뜻은 이미 계산된 값이라는 의미
		return f[n];
	else {
		f[n] = fib(n - 2) + fib(n - 1);  //중간 계산 결과를 caching
		return f[n];
	}
}
  • f 라는 배열을 -1로 초기화 해놓고 중간 계산 결과를 caching 해둔다.
  • 중간 계산 결과를 caching 함으로써 중복 계산을 피한다.

 

그림으로 memoization 설명

 

방법2: Bottom-up 

 

int fib(int n)
{
	f[1] = f[2] = 1;
	for (int i = 3; i <= n; i++) {
		f[n] = f[n - 1] + f[n - 2];
	}
	return f[n];
}

f[3] 부터 f[n]까지 계산해 나가면서 이렇게 처음 값부터 최종값까지 배열을 채워나가며 계산해내는 방식이다.

 

[알고리즘 개념] 동적 계획법 (Dynamic Programming) -(2)에서는 이항계수에 대해 다뤄볼예정이다.

728x90
728x90

'Algorithm > 알고리즘' 카테고리의 다른 글

[알고리즘 개념] 삽입 정렬 (insertion sort) c++  (0) 2022.07.19
[알고리즘 개념] 버블 정렬 (bubble sort) c++  (0) 2022.07.19
[알고리즘 개념] 선택 정렬 (selection sort) c++  (0) 2022.07.17
[알고리즘 개념] 퀵 정렬 (quick sort) c++  (0) 2022.07.16
'Algorithm/알고리즘' 카테고리의 다른 글
  • [알고리즘 개념] 삽입 정렬 (insertion sort) c++
  • [알고리즘 개념] 버블 정렬 (bubble sort) c++
  • [알고리즘 개념] 선택 정렬 (selection sort) c++
  • [알고리즘 개념] 퀵 정렬 (quick sort) c++
성장하고픈개발자
성장하고픈개발자
방학 기념 개발블로그 작성하기
    반응형
  • 성장하고픈개발자
    꾸준히하자아자
    성장하고픈개발자
  • 전체
    오늘
    어제
    • 분류 전체보기 (63)
      • 프로젝트 (5)
        • 카카오 쇼핑하기 web (4)
        • 요약쏙 (0)
      • Algorithm (46)
        • 백준 & 프로그래머스 (40)
        • 알고리즘 (5)
      • Web (5)
        • 네트워크 (1)
        • Spring (4)
        • JPA (0)
        • HTTP (1)
      • 후기 (3)
      • SSAFY 일상 (4)
      • 취준 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 깃허브
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    백준
    BOJ
    회고
    알고리즘
    testing
    백엔드
    스택
    신경망기초
    싸피 13기
    SpringBoot
    딥러닝
    코딩
    네이버데이터센터각
    C++
    FNN
    Andrew Ng
    PS
    SSAFY
    Spring Data JPA
    싸피
    합격수기
    정렬
    일상
    그리디
    withmockuser
    책리뷰
    쉬운딥러닝
    Spring
    web
    DP
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.1
성장하고픈개발자
[알고리즘 개념] 동적 계획법 (Dynamic Programming) -(1)
상단으로

티스토리툴바