피보나치 수열 중 n번째 항의 수를 리턴하는 간단한 문제였다.
입력 : int n
출력 : int타입
💡주의사항
재귀함수로 풀어야 한다
반복문의 사용이 금지된다.
아 별거아니네~ 하고 처음에는 재귀를 사용해서 룰루랄라 풀어서 제출하려고 했다.
근데 자꾸 시간초과가 뜨는 것이다..
알고보니 재귀를 이용한 문제는 메모리를 상당히 잡아먹는 비효율적인 방법이고
위 방법대로 푼다면
함수들의 총 호출횟수가 대략 2^n 근처라서 n이 25~30 넘어가면 힘들어진다고 한다.
따라서 메모이제이션을 쓰면 효율적인 알고리즘(O(N))으로 연산을 줄일 수 있다!
🔎메모이제이션이란
이미 계산된 값을 배열에 저장하고 필요시마다 값을 불러와 쓴다.
이렇게 하여 불필요하게 중복되는 계산을 줄이는 것이다!
public class fibonacci_23 {
public static void main(String[] args) {
int output = fibonacci(30);
System.out.println(output);
}
public static int fibonacci(int num) {
ArrayList<Integer> memo = new ArrayList<>(); //계산된 값을 담아줄 ArratList생성
memo.add(0); //0번째 값은 항상 0임
memo.add(1); //1번째 값은 항상 1임
return fibo(memo, num); //함수 호출
}
public static int fibo(ArrayList<Integer> memo, int num) {
if (memo.size() <= num) { //num번째 수가 계산되어 있지 않다면
memo.add(fibo(memo,num - 1) + fibo(memo,num - 2)); //num-1값과 num-1값을 더한 값을 저장해준다.
}
//num번째 수가 계산되어 있으면 여기로 넘어올 수 있다.
return memo.get(num); //num번째 수를 리턴
}
}
'Algorithm' 카테고리의 다른 글
분할 정복 정복하기~ (2) | 2023.04.20 |
---|---|
[DP]백준 9095 예제 뿌시기 (0) | 2023.04.14 |
DFS / BFS (0) | 2023.04.14 |
백준 10814 - 나이순 정렬 JAVA (0) | 2022.11.19 |
[백준 2609] 최대공약수와 최소공배수, 유클리드 호제법 (0) | 2022.11.07 |