#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <array>
#include <stack>
#include <queue>
#include <map>
#include <algorithm>
#include <numeric>
#include <cmath>
#include <regex>
// 복잡도 O(str1Len + str2Len)
std::string AddBigNum(std::string str1, std::string str2)
{
int32_t str1Len = str1.length();
int32_t str2Len = str2.length();
if (str1Len > str2Len)
{
std::swap(str1, str2);
std::swap(str1Len, str2Len);
}
std::reverse(str1.begin(), str1.end());
std::reverse(str2.begin(), str2.end());
std::string retStr = "";
int32_t carry = 0;
for (int32_t i = 0; i < str1Len; i++)
{
int32_t tempSum = (str1[i] - '0') + (str2[i] - '0') + carry;
retStr.push_back(tempSum % 10 + '0');
carry = tempSum / 10;
}
for (int32_t i = str1Len; i < str2Len; i++)
{
int32_t tempSum = (str2[i] - '0') + carry;
retStr.push_back(tempSum % 10 + '0');
carry = tempSum / 10;
}
if (carry != 0)
{
retStr.push_back(carry + '0');
}
std::reverse(retStr.begin(), retStr.end());
return retStr;
}
int main()
{
// 입력 최적화
std::cin.tie(NULL);
std::ios::sync_with_stdio(false);
int32_t num;
std::cin >> num;
std::cin.ignore();
static std::array<std::string, 10001> fibArr;
//fibArr.fill(-1);
fibArr[0] = "0";
fibArr[1] = "1";
for (int i = 2; i <= num; i++)
{
fibArr[i] = AddBigNum(fibArr[i - 1], fibArr[i - 2]);
//std::cout << fibArr[i] << "\n";
}
std::cout << fibArr[num];
//for (int i = 0; i < 10; i++)
//{
// std::cout << fibArr[i] << "\n";
//}
}
```
백준 15624번 피보나치 수 7 C++ 구현해보기
```

이번 글을 통해 배워갈 내용
- 백준 15624번 풀이
https://www.acmicpc.net/problem/15624
15624번: 피보나치 수 7
첫째 줄에 n번째 피보나치 수를 1,000,000,007으로 나눈 나머지를 출력한다.
www.acmicpc.net
백준 15624번 피보나치 수 7은
난이도 브론즈 등급의 문제로서
피보나치 수
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597.....
가 주어질 때
( 피보나치 수는 1번째 수는 0, 2번째 수는 1이고 그다음 숫자부터 전 숫자와 전전 숫자의 합을 적는 수)
(예
1 = 0 + 1,
2 = 1 + 1,
3 = 1 + 2....)
1,000,000보다 작거나 같은 자연수 또는 0이 n 값으로 주어 질 때
n번째 피보나치수를 1,000,000,007으로 나눠서 출력하면 되는 문제입니다.
30분 정도 위에 링크를 방문하셔서 풀어보시고
안 풀리시는 경우에만 아래 해답을 봐주시면 감사하겠습니다.
1,000,000 개의 숫자를 저장하는 배열을 선언하고
첫 번째 수와 두 번째 수만 지정해준 다음
for문을 돌면서
피보나치 수를 n번째 까지 전부 계산하면서 모듈러 연산을 해주고
답을 출력해주면 되는 문제이며
전체 코드는 아래와 같습니다.
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <array>
#include <stack>
#include <queue>
#include <map>
#include <algorithm>
#include <numeric>
#include <cmath>
#include <regex>
int main()
{
// 입력 최적화
std::cin.tie(NULL);
std::ios::sync_with_stdio(false);
int32_t num;
std::cin >> num;
std::cin.ignore();
static std::array<int64_t, 1000001> fibArr;
//fibArr.fill(-1);
fibArr[0] = 0;
fibArr[1] = 1;
for (int i = 2; i <= num; i++)
{
fibArr[i] = (fibArr[i - 1] + fibArr[i - 2]) % 1000000007;
}
std::cout << fibArr[num];
//for (int i = 0; i < 10; i++)
//{
// std::cout << fibArr[i] << "\n";
//}
}
연관문제의 경우
https://www.acmicpc.net/problem/2747
2747번: 피보나치 수
피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가
www.acmicpc.net
https://www.acmicpc.net/problem/2748
2748번: 피보나치 수 2
피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가
www.acmicpc.net
https://www.acmicpc.net/problem/2749
2749번: 피보나치 수 3
첫째 줄에 n이 주어진다. n은 1,000,000,000,000,000,000보다 작거나 같은 자연수이다.
www.acmicpc.net
// 2749
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <array>
#include <stack>
#include <queue>
#include <map>
#include <algorithm>
#include <numeric>
#include <cmath>
#include <regex>
// Pisano Period 참조
int main()
{
// 입력 최적화
std::cin.tie(NULL);
std::ios::sync_with_stdio(false);
int64_t num;
std::cin >> num;
std::cin.ignore();
static std::array<int64_t, 1500001> fibArr;
//fibArr.fill(-1);
fibArr[0] = 0;
fibArr[1] = 1;
num = num % 1500000;
for (int i = 2; i <= num; i++)
{
fibArr[i] = (fibArr[i - 1] + fibArr[i - 2]) % 1000000;
//std::cout << fibArr[i] << "\n";
}
std::cout << fibArr[num];
//for (int i = 0; i < 10; i++)
//{
// std::cout << fibArr[i] << "\n";
//}
}
https://www.acmicpc.net/problem/10826
10826번: 피보나치 수 4
피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가
www.acmicpc.net
// 10826
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <array>
#include <stack>
#include <queue>
#include <map>
#include <algorithm>
#include <numeric>
#include <cmath>
#include <regex>
// 복잡도 O(str1Len + str2Len)
std::string AddBigNum(std::string str1, std::string str2)
{
int32_t str1Len = str1.length();
int32_t str2Len = str2.length();
if (str1Len > str2Len)
{
std::swap(str1, str2);
std::swap(str1Len, str2Len);
}
std::reverse(str1.begin(), str1.end());
std::reverse(str2.begin(), str2.end());
std::string retStr = "";
int32_t carry = 0;
for (int32_t i = 0; i < str1Len; i++)
{
int32_t tempSum = (str1[i] - '0') + (str2[i] - '0') + carry;
retStr.push_back(tempSum % 10 + '0');
carry = tempSum / 10;
}
for (int32_t i = str1Len; i < str2Len; i++)
{
int32_t tempSum = (str2[i] - '0') + carry;
retStr.push_back(tempSum % 10 + '0');
carry = tempSum / 10;
}
if (carry != 0)
{
retStr.push_back(carry + '0');
}
std::reverse(retStr.begin(), retStr.end());
return retStr;
}
int main()
{
// 입력 최적화
std::cin.tie(NULL);
std::ios::sync_with_stdio(false);
int32_t num;
std::cin >> num;
std::cin.ignore();
static std::array<std::string, 10001> fibArr;
//fibArr.fill(-1);
fibArr[0] = "0";
fibArr[1] = "1";
for (int i = 2; i <= num; i++)
{
fibArr[i] = AddBigNum(fibArr[i - 1], fibArr[i - 2]);
//std::cout << fibArr[i] << "\n";
}
std::cout << fibArr[num];
//for (int i = 0; i < 10; i++)
//{
// std::cout << fibArr[i] << "\n";
//}
}
https://www.acmicpc.net/problem/10870
10870번: 피보나치 수 5
피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가
www.acmicpc.net
https://www.acmicpc.net/problem/11444
11444번: 피보나치 수 6
첫째 줄에 n이 주어진다. n은 1,000,000,000,000,000,000보다 작거나 같은 자연수이다.
www.acmicpc.net
가 있으며 위에 문제를 푸셨다면 나머지 문제도 쉽게 푸실 수 있으실 겁니다
읽어주셔서 감사합니다
무엇인가 얻어가셨기를 바라며
오늘도 즐거운 코딩 하시길 바랍니다 ~ :)
참조 및 인용
C++ Primer
Introduction to Algorithms
https://codemasterkimc.tistory.com/35
C++ 이론을 배울수 있는 곳 정리
개요 C++을 배우는 책, 강의, 블로그, 링크 등을 공유합니다. (링크 및 간략한 설명을 하였으나 만약 원작자가 링크를 거는것을 원치 않을 경우 연락주시기 바랍니다.) 서적 https://www.amazon.com/Prime
codemasterkimc.tistory.com
https://codemasterkimc.tistory.com/50
300년차 개발자의 좋은 코드 5계명 (Clean Code)
이번 글을 통해 배워갈 내용 좋은 코드(Clean Code)를 작성하기 위해 개발자로서 생각해볼 5가지 요소를 알아보겠습니다. 개요 좋은 코드란 무엇일까요? 저는 자원이 한정적인 컴퓨터 세상에서 좋
codemasterkimc.tistory.com
'C++ > C++ 알고리즘' 카테고리의 다른 글
| 백준 2776번 암기왕 C++ 구현해보기 (0) | 2021.10.02 |
|---|---|
| 백준 17362번 수학은 체육과목입니다2 C++ 구현해보기 (0) | 2021.09.25 |
| 백준 10807번 개수 세기 C++ 구현해보기 (0) | 2021.09.25 |
| 백준 14501번 퇴사 C++ 구현해보기 (0) | 2021.09.25 |
| 백준 11660번 구간 합 구하기 5 C++ 구현해보기 (0) | 2021.09.22 |