Algorithm/개념정리

메모이제이션 (피보나치, 타일링)

2023. 4. 20. 13:29

메모이제이션은 변수로 미리 배열의 값을 저장해두고 다음 인덱스의 배열을 만들때 사용할 수 있는 방법이다.

동일한 계산을 반복할때 이전에 계산한 값을 메모리에 저장해두어 불필요한 계산을 없애고 실행속도를 빠르게 한다.

메모이제이션(memoization)은 컴퓨터 프로그램이 동일한 계산을 반복해야 할 때, 이전에 계산한 값을 메모리에 저장함으로써 동일한 계산의 반복 수행을 제거하여 프로그램 실행 속도를 빠르게 하는 기술이다. 동적 계획법의 핵심이 되는 기술이다.
출처 - 위키피디아

 

가장 흔히 사용되는 피보나치 수열을 구하는 함수를 살펴보자.

let memo = [0,1]
function fibonacci(n) {
  if(memo[n] === undefined){
    memo[n] = fibonacci(n-2)+fibonacci(n-1)
  }return memo[n]
}
0 1 2 3 4 5 6
0 1 1 2 3 4 5

0번째와 1번째 값이 주어지고 그 뒤로는 앞의 두 값의 합이된다.

그러므로 0,1번째 값만 있으면 2번째 값부터는 0,1번째 값을 활용하여 만들어낼 수 있다.

const memo = [0,1]
//2번째 요소
memo[2] = memo[0] + memo[1]
// memo = [0,1,2]

//3번째 요소
memo[3] = memo[1]+memo[2]
//memo = [0,1,2,3]

다른 비슷한 문제로 타일링 문제가 있다.

 

가로세로 2 x n 인 보드에 2x1인 타일을 가지고 보드를 채우는 경우의 수를 구할경우

피보나치 수열과 비슷한 패턴을 보인다.

 

이부분은 외워야 좋은건가?

보통 고등학교때 수학문제처럼 등비,등차수열이 나올법한 느낌을 찾아야겠다!

0 1 2 3 4 5 6
0 1 2 3 5 8 13

 

하지만

2번째 !== 0+1

이므로

 

3번째 부터

1번째(1) + 2번째(2) = 3

 

4번째

2번째(2) + 3번째(3) = 5

 

5번째

3번째(3) + 4번째(5) = 8

 

그래서 메모이제이션을 사용할 때에도 0번째부터 2번째 까지 저장해주어야

뒤의 값을 만들어줄 수 있다.

const memo = [0,1,2]
let tiling = function (n) {
  // TODO: 여기에 코드를 작성합니다.
  // n=1/1 n=2/2 n=3/3 n=4/5 n=5/8
  //메모이제이션
  if(memo[n]===undefined){
    memo[n]= tiling(n-2)+tiling(n-1)
  }return memo[n]
};

 

처음에 n이 1이면 n-2 부분에서 1-2가되어 -1이 되면 어쩌지 ?!했는데

if문에서 이미 걸러지기 때문에 걱정할 필요가 없었다. 

코드를 내가 적어놓고 그런걱정을 하다니!!!

'Algorithm > 개념정리' 카테고리의 다른 글

[자료구조] 큐,스택,트리  (0) 2023.04.28
DFS(Depth First Search)  (2) 2023.04.25
정렬에 관하여  (0) 2023.04.22
'Algorithm/개념정리' 카테고리의 다른 글
  • [자료구조] 큐,스택,트리
  • DFS(Depth First Search)
  • 정렬에 관하여
Summer.dev
Summer.dev
프론트엔드 개발자 Summer 입니다! 피드백은 언제나 환영입니다.
Summer.dev
꾸준함이 무기
Summer.dev
전체
오늘
어제
  • 분류 전체보기
    • Projects
      • Next.js board-project
      • MOMO
    • 원티드
    • 우테코 프리코스
    • JavaScript
    • React
    • TypeScript
    • Node.js
    • Algorithm
      • 코플릿
      • 개념정리
    • 네트워크
    • 오류해결
    • 회고
    • 기술면접준비
    • git,github
    • 소소하게 궁금한것
    • Next.js Beta Docs 번역
    • 디자인패턴
    • 트러블슈팅
    • 번역

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 알고리즘
  • 메모이제이션

최근 댓글

최근 글

hELLO · Designed By 정상우.
Summer.dev
메모이제이션 (피보나치, 타일링)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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