치춘짱베리굿나이스
[백준] 1788 본문
피보나치 수의 확장
문제
수학에서, 피보나치 수는 위의 점화식과 같이 귀납적으로 정의되는 수열이다. 위의 식에서도 알 수 있듯이, 피보나치 수 F(n)은 0 이상의 n에 대해서만 정의된다.
하지만 피보나치 수 F(n)을 n이 음수인 경우로도 확장시킬 수 있다. 위의 식에서 n > 1인 경우에만 성립하는 F(n) = F(n-1) + F(n-2)를 n ≤ 1일 때도 성립되도록 정의하는 것이다. 예를 들어 n = 1일 때 F(1) = F(0) + F(-1)이 성립되어야 하므로, F(-1)은 1이 되어야 한다.
n이 주어졌을 때, 피보나치 수 F(n)을 구하는 프로그램을 작성하시오. n은 음수로 주어질 수도 있다.
입력
첫째 줄에 n이 주어진다. n은 절댓값이 1,000,000을 넘지 않는 정수이다.
출력
첫째 줄에 F(n)이 양수이면 1, 0이면 0, 음수이면 -1을 출력한다. 둘째 줄에는 F(n)의 절댓값을 출력한다. 이 수가 충분히 커질 수 있으므로, 절댓값을 1,000,000,000으로 나눈 나머지를 출력한다.
풀이
const fibo = () => {
let i = Number(require("fs").readFileSync("/dev/stdin").toString().trim());
if (i === 0) console.log("0\n0");
else {
let n = i < 0 ? -i : i;
let dp = Array.from({ length: n + 1 }, (_) => 0);
dp[1] = 1;
if (i < 0)
for (let j = 2; j <= n; j++) dp[j] = (dp[j - 2] - dp[j - 1]) % 1000000000;
else
for (let j = 2; j <= n; j++) dp[j] = (dp[j - 2] + dp[j - 1]) % 1000000000;
console.log(`${dp[n] < 0 ? -1 : dp[n] === 0 ? 0 : 1}\n${Math.abs(dp[n])}`);
}
};
fibo();
반성회
i
가 0일 때 예외처리 해주기n
에는i
의 절대값을 넣고, 이를 길이로 갖는dp
배열 만들기i
가 음수일 경우,j
는 실제 피보나치 인덱스의 절대값을 가진다i
가 양수일 경우, 보편적인 피보나치 수 구하는 방법으로 계산- 매번 계산 시마다 1,000,000,000으로 나눈 나머지를
dp
배열에 담아 오버플로우 방지 - 마지막 출력 시에는
dp[n]
의 값에 따라 첫 번째 줄에 -1, 0, 1 출력 후dp[n]
의 절대값 출력
'Javascript + Typescript > 자바스크립트로 알고리즘풀기' 카테고리의 다른 글
[백준] 15740 (0) | 2022.06.19 |
---|---|
[백준] 10816 (0) | 2022.06.19 |
[백준] 14002 (0) | 2022.06.17 |
[백준] 4999 (0) | 2022.06.17 |
[백준] 2744 (0) | 2022.06.17 |
Comments