문제 링크입니다: https://www.acmicpc.net/problem/2193
규칙을 찾다보면 피보나치 수열과 동일하다는 것을 알 수 있습니다.
핵심은 캐시와 반환값을 long long으로 선언하는 것이였습니다.
/*
0과 1로만 이루어진 수를 이진수라 한다.
이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수(pinary number)라 한다.이친수는 다음의 성질을 만족한다.
1.이친수는 0으로 시작하지 않는다.
2. 이친수에서는 1이 두 번 연속으로 나타나지 않는다. 즉, 11을 부분 문자열로 갖지 않는다.
예를 들면 1, 10, 100, 101, 1000, 1001 등이 이친수가 된다.하지만 0010101이나 101101은 각각 1, 2번 규칙에 위배되므로 이친수가 아니다.
N(1≤N≤90)이 주어졌을 때, N자리 이친수의 개수를 구하는 프로그램을 작성하시오.
*/
#include <iostream>
using namespace std;
int N; //주어진 자리
long long cache[91]; //1<=N<=90
//점화식을 작성하면 피보나치 수열과 동일하다는 것을 알 수 있다.
long long pinaryNum(void)
{
cache[1] = 1;
cache[2] = 1;
for (int i = 3; i <= N; i++)
cache[i] = cache[i - 2] + cache[i - 1]; //피보나치 수열과 동일
return cache[N];
}
int main(void)
{
cin >> N;
cout << pinaryNum() << endl;
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'알고리즘 > BOJ' 카테고리의 다른 글
백준 11052번 붕어빵 판매하기 (0) | 2018.02.13 |
---|---|
백준 1010번 다리 놓기 (0) | 2018.02.13 |
백준 9095번 1, 2, 3 더하기 (0) | 2018.02.11 |
백준 9252번 LCS2 (0) | 2018.02.11 |
백준 9461번 파도반 수열 (0) | 2018.02.09 |