백준 4150 피보나치 수(c++)

2022. 4. 2. 00:12알고리즘/백준

728x90

https://www.acmicpc.net/problem/4150

 

4150번: 피보나치 수

피보나치 수열은 다음과 같이 그 전 두 항의 합으로 계산되는 수열이다. 첫 두 항은 1로 정의된다. f(1) = 1, f(2) = 1, f(n > 2) = f(n − 1) + f(n − 2) 정수를 입력받아, 그에 해당하는 피보나치 수를 출력

www.acmicpc.net

 

 

문제를 읽어보면 알 수 있듯이 숫자의 길이가 100자리가 넘어간다.

이런 문제는 long long int도 메모리 초과가 뜨기 때문에 어떻게 풀까? 고민해봐야 된다. 

 

정답은 문자열string을 쓰면 되는데 문제를 풀 때 피보나치 수를 직접 적어보면서 코드를 어떻게 짤지 고민을 해봤다. 

 

 

//1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597  피 보나 치수

 

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
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <string>
using namespace std;
int main() {
    cin.tie(0);
    cout.tie(0);
    ios_base::sync_with_stdio(false);
 
    string str="1";
    int n;
    cin >> n;
 
    string copy;
    copy = str;
    string tmp;
    for (int i = 2; i < n; i++) {
        tmp = str;
        for (int j = 0; j < copy.size(); j++) {
            str[j] += (copy[j]-'0');
            
            if (j < copy.size() && str[j]>'9') {
                str[j] -= 10;
                if (j+1 < str.size())
                    
                    str[j + 1+= 1;
                else if (j+1 == copy.size())
                    str += '1';
            }
            
        }
        copy = tmp;
    }
 
 
    for (int i = str.size(); i != 0; i--) {
        cout << str[i-1];
    }
 
 
    return 0;
}
cs

코드를 설명하면 string은 수를 더했을 때 1의자릿수를 배열의 0번째 10의 자리 수를 배열의 1번째 넣는다고 생각했다. 그리고 1의 자리수 부터 더해갔을때 만약에 그 수가 '10'보다 크면 10을 빼주고 다음자리수에 1을 더해준다. 만약에 다음 자리수를 넣을 배열이 존재하지 않는다면? 그 문자열에 '1'을 추가해준다. 

 

3줄 요약

1. 자릿수 거꾸로 해서 더해줌 (더하기에 용이)

2. 더했을 때 '10'을 넘는지 확인 넘으면 다음 배열 더해줌

3. 다음 배열 더할 조건이 왔을 때, 배열의 크기를 초과하면 문자 '1'을 추가해줌

 

728x90

'알고리즘 > 백준' 카테고리의 다른 글

백준 24479 C++  (0) 2022.05.28
백준 22351 수학은 체육과목 입니다. 3  (0) 2022.05.23
(C++) 백준 1111번 IQ Test  (0) 2021.12.01
백준 다리놓기 1010 C++  (0) 2021.11.26
백준 1018 c++ 완전탐색(Brute-force Serch)  (0) 2021.11.03