본문 바로가기

BOJ 문제풀이

#2193 이친수

https://www.acmicpc.net/problem/2193

 

2193번: 이친수

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

www.acmicpc.net

실버 3 문제이다. 연등할때 그다음날 하루종일 고민할 문제를 빈종이에 써가는데, 어제는 이문제를 써갔었다. 근데 예상외로 너무 쉬워서 그냥 뚝-딱 풀어버렸다.

 

//2022-04-18 BOJ 2193
#include <iostream>
#include <algorithm>
using namespace std;

int n;
long long cnt;
long long dp[91][3];

int main()
{
  //freopen("input.txt","r",stdin);

  cin>>n;
  dp[1][0]=0;
  dp[1][1]=1;

  for(int i=2;i<=n;i++){
    dp[i][0]=dp[i-1][1]+dp[i-1][0];
    dp[i][1]=dp[i-1][0];
  }
  for(int i=0;i<2;i++){
    cnt+=dp[n][i];
  }

  cout<<cnt<<'\n';
}

점화식을 구성해보자.

길이가 N이고 마지막 수가 L이라고 가정한다. 이때 L은 0과 1 두가지밖에 없다.

__ __ __ ... __ __ L  -> 길이가  N

__ __ __ ... __ 0또는 1  -> 길이가 N-1

여기서 L이 1이라면 L이전에 오는 수는 1일 수 없다. L이 0이라면 L이전에 오는 수는 0또는 1이 될수 있다.

이를 토대로 점화식을 구성해보면, dp[N][1] = dp[N-1][0]  ,  dp[N][0] = dp[N-1][1] + dp[N-1][0] 가 된다.

 

이때 길이가 1인 이친수는 1 하나뿐이므로 dp[1][0]=0, dp[1][1]=1 이 된다. 이후로 for문을 돌리면서 점화식을 그대로 써주고 마지막에는 길이가 n인 이친수 개수를 모두 더해야 하므로 cnt에 더해주었다.

'BOJ 문제풀이' 카테고리의 다른 글

#1149 RGB거리  (0) 2022.04.27
#11727 2xn 타일링 2  (0) 2022.04.26
#1912 연속합  (0) 2022.04.18
#13549 숨바꼭질 3  (0) 2022.04.18
#11057 오르막 수  (0) 2022.04.17