본문 바로가기

뭐라도 공부해보자!!( 이론 )/자료구조 및 알고리즘

백준 2193, 이친수

반응형

문제

0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수(pinary number)라 한다. 이친수는 다음의 성질을 만족한다.

  1. 이친수는 0으로 시작하지 않는다.
  2. 이친수에서는 1이 두 번 연속으로 나타나지 않는다. 즉, 11을 부분 문자열로 갖지 않는다.

예를 들면 1, 10, 100, 101, 1000, 1001 등이 이친수가 된다. 하지만 0010101이나 101101은 각각 1, 2번 규칙에 위배되므로 이친수가 아니다.

N(1 ≤ N ≤ 90)이 주어졌을 때, N자리 이친수의 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다.

출력

첫째 줄에 N자리 이친수의 개수를 출력한다.

예제 입력 1

3

예제 출력 1 

2

 

 쉬운 문제다. 조건을 따지기 위해서 이중배열 형태로 자리수가 N일 때, 마지막이 0으로 끝나는 것, 1로 끝나는 것으로 나누어 이중배열 형태로 저장해 주었다. 전체적인 풀이 방식은 다이나믹 프로그래밍 방식으로, 전단계의 경우 수를 이용해 현 단계의 경우의 수를 연쇄적으로 구하는 방식을 사용하였다.

 

  1. 입력을 받는다.(N)
  2. N = 1일 때, 0으로 끝나는 경우, 1로 끝나는 경우 수를 각각 이중배열에 저장한다. (자동적으로 1번 조건 충족)
  3. 연쇄적으로 N =2일때 부터 N일 때까지 경우의 수를 구한다. 이때 조건에 의해 마지막이 1로 끝날 때는, 그 전 단계에서 1로 끝났으면 올 수 없다.
  4. 결과를 출력한다.

 

 코드는 다음과 같다.

 

#include <iostream>


int main() 
{
	int N;
	std::cin >> N;

	long long cases[91][2];
	cases[1][0] = 0;
	cases[1][1] = 1;

	if (N >= 2) 
	{
		for (int i = 2; i <= N; i++) 
		{
			cases[i][0] = cases[i-1][1] + cases[i-1][0];
			cases[i][1] = cases[i-1][0];
		}
	}

	std::cout << (long long)cases[N][0] + cases[N][1];

	return 0;
}

 

 간단한 문제였다. 한 가지 팁을 주자면, 경우의 수가 많지면 오버플로우 문제를 방지하기 위해서 long long을 사용하는 것이 좋다.

반응형