Code KATA/알고리즘 코드카타

[2025.02.17] 피보나치 수

iiblueblue 2025. 2. 17. 09: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)=2+3=5

와 같이 이어집니다.

 

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

 

 

제한사항

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

 

 

입출력 예

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

 

 

문제 풀이

풀이 언어 : C++

#include <string>
#include <vector>
using namespace std;

int solution(int n) {
    int answer = 0;
    
    vector<long long> fibNum;
    fibNum.push_back(0);
    fibNum.push_back(1);
    
    for(int i=2; i<=n; i++)
    {
        fibNum.push_back((fibNum[i-1]%1234567+fibNum[i-2]%1234567)%1234567);
    }
    
    answer=fibNum[n];
    return answer;
}

문제도 길지 않고 결론적으로 코드도 길지 않지만 생각보다 많은 생각을 하게 되었던 문제였다. 아래 오답노트를 보면 알 수 있지만 문제에서 말하는대로 구현한다고 해서 풀리는 문제가 아니었다.

 

말하는대로 구현하고자 하면 먼저 fibNum이라는 벡터를 선언하고 0번째와 1번째에 각각 0과 1을 넣기위해 push_back 해준다. 그리고 반복문을 돌리면서 알맞은 수를 push_back 해준다. fibNum(i-1)+fibNum(i-2)의 결과를 push_back 해주어야 하는데 이렇게 문제에 나온 그대로 계산하면 7개의 테스트케이스에서 오답이라는 글자를 만나야만 한다. 뒤로 갈 수록 숫자가 너무 커지기 때문인데 숫자를 줄이기 위해서 한 가지 처리를 해준다. 결과값으로 1234567로 나눈 나머지를 요구하였으니 fibNum[i-1]과 fibNum[i-2]에 각각 1234567로 나눈 나머지의 계산을 해주고 두 수를 더한 값에도 나머지 연산을 해주는 것이다.

 

마지막으로 정답값 answer을 반환해주면 된다.

 

참고 사항

나머지 연산에는 아래와 같은 특징이 있다. 

(a + b) % m = ((a % m) + (b % m)) %m

 

 

오답 노트

fibNum 벡터의 데이터 타입을 int로 해도 long으로 해도, long long으로 해도 피보나치 수를 계산하다가 그 범위를 넘어가는 건 막을 수 없었다. 아무리 데이터형을 바꿔도 해결하지 못하던 것을 나머지 연산의 특징을 이용해 해결할 수 있었다. 각각의 수에 나머지 연산이 들어가고 마지막에도 나머지 연산을 해주니 연산 중 값이 데이터형의 크기를 넘어가지 않아서 오류 없이 풀이할 수 있었다.

#include <string>
#include <vector>
using namespace std;

int solution(int n) {
    int answer = 0;
    
    vector<long long> fibNum;
    fibNum.push_back(0);
    fibNum.push_back(1);
    
    for(int i=2; i<=n; i++)
    {
        fibNum.push_back(fibNum[i-1]+fibNum[i-2]);
    }
    
    answer=fibNum[n]%1234567;
    return answer;
}

 

 

문제 링크

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

 

'Code KATA > 알고리즘 코드카타' 카테고리의 다른 글

[2025.02.19] 예상 대진표  (0) 2025.02.19
[2025.02.18] 카펫  (0) 2025.02.18
[2025.02.11] 달리기 경주  (1) 2025.02.11
[2025.02.10] 개인정보 수집 유효기간  (0) 2025.02.10
[2025.02.07] 햄버거 만들기  (1) 2025.02.07