Notice
Recent Posts
Recent Comments
- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
Tags
- Kotlin
- tomtoc
- 안드로이드
- DataBinding
- ssafy서울
- Android
- 등산로조성
- kotiln
- 탐탁노트북파우치
- 비트마스킹
- 아키텍처패턴
- 백준
- nullalble
- bitmasking
- 자바
- 알고리즘
- 삼성파우치
- 탐탁삼성파우치
- 싸피
- 안드로이드#코틀린#디자인패턴#싱글턴패턴#개발#앱개발
- 코틀린
- 투포인터
- MVVM
- 코딩테스트
- 삼성청년sw아카데미
- Higher-Order
- 삼성역량테스트
- #충무로맛집#골목식당#스테이크#
- lateinit
- Java
Archives
공상하는 개발자
[동적 프로그래밍/JAVA] 메모이제이션 파헤치기 본문
반응형
항상 동적 프로그래밍 앞에만 서면..
작아지는 나..
이제는 그러지 않겠다는 마인드를 가지고!!
대대적인 DP 정복 포스팅을 시작해보자~
첫 번째 주제는 메모이제이션 기법이다!
그렇다면 완벽한 DP를 위해 달려보자.
동적 계획법은 무엇일까?
-> 복잡한 문제를 간단한 여러 가지 문제로 나누어서 푸는 방법.
-> 중복된 부분을 제외하여 한번만 계산하고도 구할 수 있어서 시간, 공간 복잡도를 줄일 수 있는 장점이 있다.
피보나치를 구하는 두가지 방법
1. 재귀를 이용하여 그냥 구하기.
-> 답은 나오지만 숫자가 커질수록 되풀이되는 함수가 많아져서 시간이 오래 걸린다. (시간 복잡도 : O(2^n))
static long fibo(int N) {
if (N <= 1) {
return N;
} else {
return fibo(N - 1) + fibo(N - 2);
}
}
2. 메모이제이션을 이용하여 구하기.
-> 한번 구한 계산은 더 이상 계산하지 않고 가져다 쓰는 개념이라 시간이 확 줄어든다. (시간 복잡도 : O(n))
static long[] arr = new long[51]; // 저장해둘 배열 선언
static long fiboMemoization(int N) {
if (N == 0) {
return arr[0];
} else if (N == 1) {
return arr[1];
} else if (arr[N] != 0) { // 한 번 이상 구한 것은 바로 저장된 값 리턴!!
return arr[N];
} else {
return arr[N] = fiboMemoization(N - 1) + fiboMemoization(N - 2);
}
}
두개 기법 비교!
1. 재귀를 이용하여 그냥 구하기.
답 : 1134903170
실행 시간 : 3.994
-------------------------------------
2. 메모이제이션을 이용하여 구하기.
답 : 1134903170
실행 시간 : 0.0
-> 45의 피보나치수열을 구했을 때 위와 같이 나타난다. 숫자가 커지면 커질수록 실행시간의 차이는 커지게 된다.
결론
-> 메모이제이션을 잘 사용하자! 동적 계획법을 효율적으로 짤 수 있다!
반응형
'개발 > 알고리즘' 카테고리의 다른 글
[알고리즘] 비트마스크(BitMask) 스킬 숙련하기(feat. 백준 1194 달이 차오른다, 가자.) (0) | 2020.05.17 |
---|---|
[알고리즘/JAVA] 투포인터 알고리즘 (1) | 2020.05.10 |
[알고리즘/JAVA] SWEA 1949 등산로 조성 (BFS,DFS) (0) | 2020.05.03 |
[알고리즘/자바] 다익스트라 알고리즘 (Dijkstra Algorithm) (1) | 2020.04.26 |
[코딩테스트 후기] 2020 라인 코딩테스트 후기(문제 해설X,찐 후기) (0) | 2020.04.06 |
Comments