반응형
이번 문제는 복잡하게 썼지만, 결국 피보나치 수열을 구하는 문제입니다.
길이가 N인 01 타일의 이진수를 얻기 위해서는 길이가 N-1인 01 타일의 이진수에 1이 쓰인 타일을 붙이거나 길이가 N-2인 01 타일의 이진수에 00이 쓰인 타일을 붙여야 합니다. 이것을 식으로 표현하면,
\[ d_{0} = 1 \]
\[ d_{1} = 1 \]
\[ d_{n} = d_{n-1} + d_{n-2} \]
점화식을 보면, 피보나치 수열임을 알 수 있습니다. 단지 시작점이 다른 피보나치 수열이죠.
피보나치 수열을 계산하는 방법은 단순하게 반복문을 돌리는 것이 편합니다. 재귀함수는 아주 시간이 많이 걸리고, 배열을 잡아서 하는 방법도 있지만, 전 그냥 편의상 두개의 변수만을 잡아서 사용했습니다.
제가 작성한 소스입니다. 소스는 참고용으로 봐주세요.
//------------------------------------------------
// baekjoon #1904
// - by Aubrey Choi
// - created at 2019-06-16
//------------------------------------------------
#include <stdio.h>
int fib(int n)
{
int a = 1, b = 1;
for(int i = 0; i < n / 2; i++)
{
a = (a + b) % 15746;
b = (a + b) % 15746;
}
return (n % 2) ? b : a;
}
int main()
{
int n;
scanf("%d", &n);
printf("%d\n", fib(n));
return 0;
}
728x90
'Programming > BOJ' 카테고리의 다른 글
[C/C++] 백준 #1913 달팽이(수학) (2) | 2022.11.03 |
---|---|
[C/C++] 백준 #1912 연속합(탐욕 알고리즘) (0) | 2022.11.02 |
[C/C++] 백준 #1890 점프(동적 계획법) (0) | 2022.11.01 |
[C/C++] 백준 #1874 스택 수열(스택) (0) | 2022.10.31 |
[C/C++] 백준 #1850 최대공약수(수학) (0) | 2022.10.25 |
댓글