728x90
SMALL
백준 문제 풀이: 10826 [피보나치 수 4]
문제 링크: https://www.acmicpc.net/problem/10826
문제 설명:
피보나치 수열의 n
번째 값을 계산하는 문제입니다. 단, n
이 매우 커질 수 있으므로, 결과를 저장할 자료형으로 문자열을 사용해야 합니다.
문제 해결 코드
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
string dp[10001]; // 각 피보나치 수를 문자열로 저장
// 두 문자열 숫자를 더하는 함수
string sum(string a, string b) {
string result = "";
int carry = 0; // 올림 수
// 문자열의 끝에서부터 더하기
while (a.size() || b.size()) {
int num1 = 0, num2 = 0;
if (a.size()) {
num1 = a.back() - '0'; // 문자 → 숫자
a.pop_back();
}
if (b.size()) {
num2 = b.back() - '0'; // 문자 → 숫자
b.pop_back();
}
// 현재 자리의 합 계산
int currentSum = num1 + num2 + carry;
result += to_string(currentSum % 10); // 현재 자리수
carry = currentSum / 10; // 올림 수 계산
}
// 마지막으로 올림 수가 남아있다면 추가
if (carry) {
result += "1";
}
// 문자열 뒤집기
reverse(result.begin(), result.end());
return result;
}
int main() {
int n;
cin >> n;
// 초기 피보나치 값 설정
dp[0] = "0";
dp[1] = "1";
// 피보나치 수 계산
for (int i = 2; i <= n; i++) {
dp[i] = sum(dp[i - 1], dp[i - 2]);
}
// 결과 출력
cout << dp[n] << '\n';
return 0;
}
코드 설명
- 핵심 알고리즘: 문자열로 표현된 두 큰 숫자를 더하는 방식을 구현하여 피보나치 수열을 계산합니다.
- 구현 세부사항:
sum(string a, string b)
: 두 문자열 숫자를 더해 새로운 문자열로 반환- 각 자리의 숫자를 더하고, 올림수를 반영하며 결과 문자열을 구성
- DP 배열
dp[i]
:i
번째 피보나치 수를 저장
- 시간 복잡도 분석: O(n × L)
n
: 피보나치 수의 인덱스L
: 피보나치 수의 자리수
결과
피보나치 수열의 매우 큰 수를 정확히 계산하고 출력할 수 있습니다. 문자열 연산을 활용하여 효율적으로 문제를 해결했습니다.
다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!
728x90
LIST
'BAEKJOON > 다이나믹 프로그래밍' 카테고리의 다른 글
백준 14002번 [가장 긴 증가하는 부분 수열 4](C++) -yes6686- 티스토리 (0) | 2024.01.27 |
---|---|
백준 2240번 [자두나무](C++) -yes6686- 티스토리 (0) | 2024.01.26 |
백준 10844번 [쉬운 계단 수](C++) -yes6686- 티스토리 (0) | 2024.01.25 |
백준 15486번 [퇴사 2](C++) -yes6686- 티스토리 (1) | 2024.01.24 |
백준 11053번 [가장 긴 증가하는 부분 수열](C++) -yes6686- 티스토리 (0) | 2024.01.23 |