마이의 개발 블로그

[프로그래머스] 피보나치 수 (Java) 본문

코딩테스트/프로그래머스

[프로그래머스] 피보나치 수 (Java)

개발자마이 2022. 3. 3. 01:17
반응형
 

코딩테스트 연습 - 피보나치 수

피보나치 수는 F(0) = 0, F(1) = 1일 때, 1 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 수 입니다. 예를들어 F(2) = F(0) + F(1) = 0 + 1 = 1 F(3) = F(1) + F(2) = 1 + 1 = 2 F(4) = F(2) + F(3) = 1 + 2 = 3 F(5) = F(3) + F(4) =

programmers.co.kr

 

작성 코드

- 처음에는 레벨 2에 이게 왜 있는지는 잘 이해가 되지 않았는데, 재귀로 풀어내니 시간초과가 떴다.

//시간초과 코드
class Solution {
    public int solution(int n) {
        int answer = 0;
        
        answer = fibonacci(n) % 1234567;
        
        return answer;
    }
    
    int fibonacci(int n){
        
        if(n == 0 || n == 1)
            return n;
        
        return fibonacci(n-1) + fibonacci(n-2);
    }
}

 

반복문으로 고쳤는데도 해결이 안 됐는데 알고보니 integer의 범위를 넘어가서 생기는 문제였음을 알게되었다.

(참고 : 7번부터 오답이 나오는 이유)

//범위문제로 7번 이후 통과못한 코드
class Solution {
    public int solution(int n) {
       
        int answer = 0;

        int[] array = new int[2];

        array[0] = 0;
        array[1] = 1;

        if(n == 0 || n == 1){
            answer = n;
        }else{
            
            for(int i=0; i<n-1; i++){
                array[i%2] = array[0] + array[1];
            } 
            
            answer = array[n%2] % 1234567;
        }

        return answer;
    }
    
}

 

먼저 1234567로 나눠주어 도출된 나머지값들로만 피보나치 수열을 만들면 해결된다. 나는 두 칸짜리 int 배열을 활용하여 좌우를 오가며 저장되게끔 만들었다.

//통과한 코드
class Solution {
    public int solution(int n) {
       
        int answer = 0;

        int[] array = new int[2];

        array[0] = 0;
        array[1] = 1;

        if(n == 0 || n == 1){
            answer = n;
        }else{
            
            for(int i=0; i<n-1; i++){
                array[i%2] = (array[0] + array[1]) % 1234567;
            } 
            
            answer = array[n%2];
        }

        return answer;
    }
}

 

 

 

반응형
Comments