알고리즘

다이나믹 프로그래밍

2023. 5. 9. 20:15

 

 

다이나믹 프로그래밍은 동적 계획법이라고도 부른다.

일반적인 프로그래밍 분야에서의 동적(Dynamic)은 '프로그램이 실행되는 도중에 실행에 필요한 메모리를 할당하는 기법'을 의미하지만, 다이나믹 프로그래밍에서 '다이나믹'은 별다른 의미 없이 사용된 단어다.

 

다이나믹 프로그래밍은 메모리를 적절히 사용하여 수행 시간 효율성을 비약적으로 향상시키는 방법이다.

이미 계산된 결과(작은 문제)는 별도의 메모리 영역에 저장하여 다시 계산하지 않도록 한다.

다이나믹 프로그래밍의 구현은 일반적으로 두 가지 방식(탑다운과 바텀업)으로 구성된다.

 

탑다운 vs 바텀업

function fibonacci(n, dp) {
    if (n === 0) return 0;
    if (n === 1) return 1;

    if (dp[n] !== undefined) return dp[n];

    dp[n] = fibonacci(n - 1, dp) + fibonacci(n - 2, dp);
    return dp[n];
}

const dp = new Array(100).fill(-1);
console.log(fibonacci(10, dp));

재귀로 푼 피보나치 수열. 구하고자 하는 피보나치 수열에서 거꾸로 내려왔다가(탑다운) 다시 올라가면서 계산되는 탑다운 방식이다.

 

function fibonacci(n) {
    const dp = [0, 1];

    for (let i = 2; i <= n; i++) {
        dp[i] = dp[i - 1] + dp[i - 2];
    }

    return dp[n];
}

console.log(fibonacci(10));

다이나믹 프로그래밍으로 푼 피보나치 수열. 0번째부터 차례로 계산해서 채워 나가는 바텀업 방식이다.

 

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

 

1. 최적 부분 구조 (Optimal Substructure)

큰 문제를 작은 문제로 나눌 수 있으며 작은 문제의 답을 모아서 큰 문제를 해결할 수 있다.

 

2. 중복되는 부분 문제 (Overlapping Subproblem)

동일한 작은 문제를 반복적으로 해결해야 한다.

 

LeetCode: Pascal's triangle

var generate = function(numRows) {
  if (numRows === 1) return [[1]]

  const answer = [[1], [1,1]];
  for (let i = 2; i < numRows; i++) {
    answer[i] = Array(i + 1).fill(0)
    answer[i] = answer[i].map((cur, idx) => {
      if (idx === 0) return 1;
      if (idx === answer[i].length -1) return 1;
      else return answer[i - 1][idx - 1] + answer[i - 1][idx];
    });
  }
  return answer;
};

map 사용을 멍총이같이 해서 시간 내에 못풀었다ㅠㅠ 나를 구해주신 갓쿵야... 사랑해잉🤍

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

[자료구조] 배열, 연결리스트  (1) 2023.08.29
프로그래머스 lv.2 전력망을 둘로 나누기  (1) 2023.05.02
완전탐색  (0) 2023.04.25
DFS/BFS  (0) 2023.04.11
[자료구조] 스택/큐  (0) 2023.04.04
'알고리즘' 카테고리의 다른 글
  • [자료구조] 배열, 연결리스트
  • 프로그래머스 lv.2 전력망을 둘로 나누기
  • 완전탐색
  • DFS/BFS
JeanneLee57
JeanneLee57
공부하고 기록을 남기는 개발자 Jeanne
JeanneLee57
코딩은 진리
JeanneLee57
전체
오늘
어제
  • 분류 전체보기 (115)
    • Javascript (15)
    • React (15)
    • Next.js (8)
      • Next.js 베타 문서 번역 (5)
    • 프로젝트 (34)
      • 미니 프로젝트 & 과제 (25)
      • SEB 44 pre-project (1)
      • SEB 44 main-project (8)
    • 알고리즘 (12)
    • 부트캠프 준비 (6)
    • 기술면접 (3)
    • CS (7)
    • 코드스테이츠 프론트엔드 부트캠프 (12)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • JavaScript
  • 유데미
  • 프리코드캠프
  • react
  • 회고
  • 부트캠프준비
  • 구조분해할당
  • 번역
  • 프론트엔드
  • 코드스테이츠
  • RTK
  • 알고리즘
  • codestates
  • Next.js
  • 부트캠프
  • 프로그래머스
  • 고차함수
  • CSS
  • HTML
  • useEffect

최근 댓글

최근 글

hELLO · Designed By 정상우.
JeanneLee57
다이나믹 프로그래밍
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.