티스토리 뷰

문제

https://school.programmers.co.kr/learn/courses/30/lessons/12945?itm_content=course14743 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

언어

자바 Java

로직

제한 사항이 2 <= n  <= 100,000입니다. 재귀함수를 사용할 시에 depth 때문에 분명 StackOverFlow가 발생할 듯합니다. 따라서 재귀함수 + dp를 사용하여 해결하였습니다.

 

메모이제이션 배열 선언

한 번 답을 구했으면 추후에 다시 구하지 않도록 하기 위하여 메모이제이션 배열을 선언 및 초기화합니다. 피보나치 수열의 경우 n이 커질수록 값이 매우 커집니다. 따라서 long 타입으로 사용해야 하지만, 최종적으로 1234567을 나눈 나머지를 반환하는 게 문제이기 때문에 int 타입을 사용해도 됩니다.

int[] dp = new int[n + 1];
Arrays.fill(dp, -1);

피보나치 함수

피보나치의 종료 조건을 작성합니다. 이미 메모이제이션에 저장된 값이거나 0 또는 1일 때 값을 그대로 반환합니다.

if(dp[num] != -1)
    return dp[num];
if(num == 0 || num == 1)
    return num;

위의 두 가지 조건을 만족하지 않는다면 피보나치 함수를 다시 호출합니다.(재귀호출)

return fibonacci(dp, num - 1) + fibonacci(dp, num - 2);

메모이제이션 배열에 값 저장

for(int num = 2; num <= n; num++) {
    dp[num] = fibonacci(dp, num) % 1234567;
}

코드

import java.util.Arrays;

class Solution {
    public int solution(int n) {
        int[] dp = new int[n + 1];
        Arrays.fill(dp, -1);

        for(int num = 2; num <= n; num++) {
            dp[num] = fibonacci(dp, num) % 1234567;
        }

        return dp[n];
    }

    private int fibonacci(int[] dp, int num) {
        if(dp[num] != -1)
            return dp[num];
        if(num == 0 || num == 1)
            return num;

        return fibonacci(dp, num - 1) + fibonacci(dp, num - 2);
    }
}
Total
Today
Yesterday
최근에 올라온 글
«   2024/11   »
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