CodingTest

프로그래머스 - 피보나치 수 (JAVA)

쩡선영 2024. 2. 15. 18:33

 

코테 스터디를 끝낸 후, 코테 관련 블로그는 잘 안올릴려 했으나

이 문제는 꼭 블로그에 포스팅하여 한 번 더 정리하고 넘어가야겠다는 생각이 들어

오랜만에 코테 관련 블로그를 끄적여봅니다😖😖

 

 

프로그래머스 피보나치 수 2단계 문제입니다

https://school.programmers.co.kr/learn/courses/30/lessons/12945

 

프로그래머스

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

programmers.co.kr

 


 

❓문제설명

피보나치 수는 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) = 2 + 3 = 5
와 같이 이어집니다.

2 이상의 n이 입력되었을 때, n번째 피보나치 수를 1234567으로 나눈 나머지를 리턴하는 함수, solution을 완성해 주세요.

 

 

⚠️ 제한사항 및 입출력 

  • n은 2 이상 100,000 이하인 자연수입니다.
n return
3 2
5 5

 

 


✏️ 나의 풀이

피보나치 수는 워낙 유명하며, 수업시간때도 몇번 다뤄본 문제이기에 제귀함수를 써서 가볍게 풀어냈다

 

class Solution {
    public int solution(int n) {
        if(n <= 1)
            return n;
        else 
            return solution(n-1) + solution(n-2);
    }
}

 

이게 내가 처음 푼 풀이인데, 답은 맞았지만 시간초과가 나버렸다.

하지만 난 제귀함수로 푸는 방법 밖에 몰랐기에 매우 혼란스러웠다.

그 와중, 어떤 분이 잘 써주신 글을 보게 되었다.

 

 

 

위 글을 보고 머리를 한 대 띵 맞은 느낌이였다. 세상에 천재분들은 많구나...

또, 여태까지 메모리 신경을 잘 안쓰며 개발했던 나날들이 후회하게 되었다.

 

class Solution {
    public int solution(int n) {
        int answer[] = new int[n+1];
        
        for(int i=0; i<=n; i++){
            if(i == 0) answer[i] = 0;
            else if(i == 1) answer[i] = 1;
            else {
                int sum = answer[i-2] + answer[i-1];
                answer[i] = sum % 1234567;
            }
        }
        
        return answer[n];
    }
}

 

그래서 위와 같이 코드를 새로 짰다. 이번엔 당연히 통과!!!

 

위 코드를 간단히 설명해보자면,

  1. n보다 하나 더 큰 배열을 생성해주고
  2. 피보나치 수 0과 1의 값은 0과 1이니 예외처리 해주었다.
  3. 그리고 배열 index 특징을 살려서 f(n-1) + f(n-2)한 값을 sum이라는 변수에 담아주었다.
  4. answer[i]에는 sum % 1234567 값을 넣어 메모리 초과가 안되게 해주었다.