백준 문제/DP
[백준] 1788번 피보나치 수의 확장
dubu0721
2025. 2. 23. 15:43
basic-algo-lecture/workbook/0x10.md at master · encrypted-def/basic-algo-lecture
basic-algo-lecture/workbook/0x10.md at master · encrypted-def/basic-algo-lecture
바킹독의 실전 알고리즘 강의 자료. Contribute to encrypted-def/basic-algo-lecture development by creating an account on GitHub.
github.com
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
//#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
vector<int> plusNums(1000001); // 0~1000000
vector<int> minusNums(1000001); // -1000000 ~ 0
plusNums[1] = 1;
minusNums[1] = 1;
for (int i = 2; i < 1000001; i++) {
plusNums[i] = (plusNums[i - 1] + plusNums[i - 2]) % 1000000000;
minusNums[i] = (minusNums[i - 2] - minusNums[i - 1]) % 1000000000;
}
int n;
cin >> n;
int answer;
answer = n < 0 ? minusNums[n * -1] : plusNums[n];
if (answer == 0) {
cout << 0 << "\n" << answer;
}
else if (answer > 0) {
cout << 1 << "\n" << answer;
}
else {
cout << -1 << "\n" << -1 * answer;
}
return 0;
}
나는 n 이 음수인 경우와 아닌 경우를 따로 배열로 만들었다.
n 이 양수인 경우의 table 은 기존 피보나치 수열을 구하는 방식과 똑같이 해주면 된다. n 이 음수인 경우의 table 은 기존 피보나치 수열 계산 방법과 살짝 다르다. n 이 음수인 경우의 dp[i] 의 값은 dp[i-2] - dp[i-1] 과 같다.
처음 제출했을 때 틀렸습니다가 떠서 문제를 다시 읽어봤더니 " 절댓값을 1,000,000,000으로 나눈 나머지를 출력한다." 라고 되어있었다. 즉, dp 에 수를 저장할 때 1,000,000,000 으로 나눈 나머지값을 저장해야 하는 것이었다;;
왜 문제를 제대로 안 읽을까? 아니 사실 읽긴 했는데 문제 푸느라 급급해서 문제 조건을 쉽게 까먹는 것 같다;; 조심해야 하는데 바뀌지를 않는다;;
