- 문제
0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수(pinary number)라 한다. 이친수는 다음의 성질을 만족한다.
- 이친수는 0으로 시작하지 않는다.
- 이친수에서는 1이 두 번 연속으로 나타나지 않는다. 즉, 11을 부분 문자열로 갖지 않는다.
예를 들면 1, 10, 100, 101, 1000, 1001 등이 이친수가 된다. 하지만 0010101이나 101101은 각각 1, 2번 규칙에 위배되므로 이친수가 아니다.
N(1 ≤ N ≤ 90)이 주어졌을 때, N자리 이친수의 개수를 구하는 프로그램을 작성하시오.
- 입력
첫째 줄에 N이 주어진다.
3
- 출력
첫째 줄에 N자리 이친수의 개수를 출력한다.
2
#include <iostream>
using namespace std;
long long DP[91][2];
int main()
{
int n;
cin >> n;
DP[1][0] = 0; DP[1][1] = 1;
for (int i = 2; i <= n; ++i)
{
DP[i][0] = DP[i - 1][0] + DP[i - 1][1];
DP[i][1] = DP[i - 1][0];
}
cout << DP[n][0] + DP[n][1];
}
결과분석
문제에서 설명한 조건을 보면 이친수의 경우 0과 1로만 이루어져 있고 맨 앞에 0이 올 수 없으며 1이 두 번 연속으로 나타날 수 없다고 되어있다. 이러한 조건을 적용하였을 때 한 자릿수의 이친수는 '1'뿐이며 두 자릿수의 이친수는 '10'뿐이다. 세 자릿수의 이친수는 '100', '101'이 있다.
네 자릿수의 이친수의 경우의 수를 생각해보면, 바로 이전 자릿수인 세 자릿수의 이친수에 '0' 또는 '1'을 하나 추가로 붙인 것과 같다. 다만 '1'이 두 번 연속될 수 없기 때문에 세 자릿수 이친수에서 가장 뒤의 숫자가 '1'인 '101'의 경우에는 '1'은 붙일 수 없으며 '0'만 붙일 수 있다. 위의 코드는 이러한 규칙을 적용하여 작성한 결과입니다.
'🥇 Problem Solving > Dynamic Programming' 카테고리의 다른 글
[C++] BOJ / 1699번 / 제곱수의 합 (0) | 2021.11.28 |
---|---|
[C++] BOJ / 11053번 / 가장 긴 증가하는 부분 수열 (0) | 2021.11.27 |
[C++] BOJ / 10844번 / 쉬운 계단 수 (0) | 2021.11.27 |
[C++] BOJ / 15990번 / 1, 2, 3 더하기 5 (0) | 2021.11.27 |
[C++] BOJ / 11052번 / 카드 구매하기 (0) | 2021.11.27 |