『Do it! 알고리즘 코딩 테스트 with JAVA 강의』를 듣고 정리한 글입니다.
사실 모든 알고리즘 문제들은 완전 탐색을 이용해 정답을 도출할 수 있다. 단지 비효율적인 연산과 시간을 없애고, 답을 효율적으로 도출하기 위해 여러 알고리즘 기법이 생긴 것이다.
동적 계획법의 가장 대표적인 문제이다.
동적 계획법으로 풀 수 있는지 확인하기
점화식 세우기
메모이제이션 원리 이해하기
톱-다운 구현 방식 이해하기
/**
* Top-down 방식의 피보나치 수열
*/
static int[] D;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
D = new int[n+1];
for(int i=0; i<=n; i++) {
D[i] = -1;
}
D[0] = 0;
D[1] = 1;
fibo(n);
System.out.println(D[n]);
}
static int fibo(int n) {
// 기존에 계산한 적이 있는 부분의 문제일 경우
if (D[n] != -1) {
return D[n];
}
// 메모이제이션: 구한 값을 바로 리턴하지 않고
// DP 테이블에 저장한 후 리턴하도록 구현
return D[n] = fibo(n-2) + fibo(n-1);
}
바텀-업 구현 방식 이해하기
/**
* Bottom-up 방식의 피보나치 수열
*/
static int[] D;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
D = new int[n+1];
for(int i=0; i<=n; i++) {
D[i] = -1;
}
D[0] = 0;
D[1] = 1;
for(int i=2; i<=n; i++) {
D[i] = D[i-1]+D[i-2];
}
System.out.println(D[n]);
}
static int fibo(int n) {
// 기존에 계산한 적이 있는 부분의 문제일 경우
if (D[n] != -1) {
return D[n];
}
// 메모이제이션: 구한 값을 바로 리턴하지 않고
// DP 테이블에 저장한 후 리턴하도록 구현
return D[n] = fibo(n-2) + fibo(n-1);
}