본문 바로가기

알고리즘

프로그래머스[12945] - 피보나치 수열(lv2)

반응형

문제는 여기서!

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 이하인 자연수입니다.

입출력 예

nreturn
3 2
5 5

입출력 예 설명

피보나치수는 0번째부터 0, 1, 1, 2, 3, 5, ... 와 같이 이어집니다.

문제가 잘 안풀린다면😢

힌트가 필요한가요? [코딩테스트 연습 힌트 모음집]으로 오세요! → 클릭

 

문제해결 keyPoint

  1. 피보나치 수열의 값을 구한다.
  2. 구해진 피보나치 수열에 1234567을 나누는 부분으로 나눈다.
  3. n번째 수열의 값은 n-2,n-1번째 수열의 값을 더한 값이다.
  4. 경계 값으로 테스트 해보면 알겠지만, int형으로는 오버플로우가 일어난다.

 

20220919 1차시도

더보기

음.. 뭐지?... 시간초과 하는 부분도 있을거라고 생각했는데, 의외로 그냥 구해졌다. 

 

이걸 DFS? BFS로도 구할 수 있을까?? 

 

시간초과?? 를 생각하면 더 구할 수 있는 방법이 있을까??

import java.math.*;

class Solution {
    public int solution(int n) {
       /**
         * 1. 피보나치 수열의 값을 구한다.
         * 2. 구해진 수열의 값에 1234567을 나눈 나머지를 반환한다.
         * 3. n번째 수열은 n-1,n-2 번째 수열의 값을 더한 값이다.
         * 4. for문으로 0부터 모든 값을 계산하면 값을 구할 수 있다.
         * 5. int, long형으로도 수열 계산이 범위를 벗어난다.
         */
       int answer = 0;

        //피보나치 수열을 구한다.
        BigDecimal number = this.getNumber(n);

        //구해진 수열의 값에서 나머지를 구한다.
        answer = this.getResult(number).intValue();

        return answer;
    }

    public BigDecimal getNumber(int n){
        /**
         * TODO: 피보나치 수열은 어떻게 구할수 있을까?..
         * 단순한 for문으로는 long형으로도 오버플로우가 난다.. BigDecimal??
         */
        //피보나치 수열
        BigDecimal[] fArr = new BigDecimal[n+1];
        fArr[0] = BigDecimal.ZERO;
        fArr[1] = BigDecimal.ONE;
        // 나이브하게 for문으로 구해보기
        for(int i=2; i<=n; i++){
             fArr[i] = fArr[i-2].add(fArr[i-1]);
        }

        return fArr[n];
    }

    public BigDecimal getResult(BigDecimal number){
        return number.remainder(new BigDecimal(1234567));
    }
}
이게 맞네?...
반응형