STUDY.md
  • 백준 2193번 = 이친수 (C/C++)
    2025년 01월 25일 17시 53분 32초에 업로드 된 글입니다.
    작성자: 방세연

     

     

    미친수 이친수를 풀어보려고 한다.

    오마이갓 너무 쉬운 문제인데 엄청 헤맸다!!!!!!!

     

    이참에 dp 문제에 대한 접근 방식을 확실히 해보려고 한다.

     

     

     

     

     

    문제
    0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 
    이들을 이친수(pinary number)라 한다. 이친수는 다음의 성질을 만족한다.
    
    이친수는 0으로 시작하지 않는다.
    이친수에서는 1이 두 번 연속으로 나타나지 않는다. 즉, 11을 부분 문자열로 갖지 않는다.
    예를 들면 1, 10, 100, 101, 1000, 1001 등이 이친수가 된다. 
    하지만 0010101이나 101101은 각각 1, 2번 규칙에 위배되므로 이친수가 아니다.
    
    N(1 ≤ N ≤ 90)이 주어졌을 때, N자리 이친수의 개수를 구하는 프로그램을 작성하시오.
    
    입력
    첫째 줄에 N이 주어진다.
    
    출력
    첫째 줄에 N자리 이친수의 개수를 출력한다.

     

     

     

     

     

     


     

     

     

    해답

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    int total = 0;
    
    int main() {
    	int N;
    	cin >> N;
    	vector<long long> dp(N);
    	dp[0] = 1;
    	dp[1] = 1;
    
    	for (int i = 2; i < N; i++)
    	{
    		dp[i] = dp[i - 1] + dp[i - 2];
    	}
    
    	cout << dp[N - 1] << endl;
    }

     

    DP문제에 올바르게 접근하기 위해서는 규칙을 알아내는 것이 중요하다.

    규칙은 수열과 같은 형태 값으로 주어질 수 있고, 이를 점화식을 이용해 코드로 구현하는게 중요하다.

     

    그럼 이제 규칙을 알아보자.

    n == 1
    1
    (1개)
    
    n == 2
    10
    (1개)
    
    n == 3
    100
    101
    (2개)
    
    n == 4
    1000
    1001
    1010
    (3개)
    
    n == 5
    10000
    10100
    10101
    10001
    10010
    (5개)
    
    
    n == 6
    100000
    100001
    100010
    100100
    101000
    100101
    101001
    101010
    (8개)
    
    D[i] = D[i-1] + D[i-2];

     

    백준의 문제 설명 예시를 보면 n이 1일 때 이친수는 한 개, n이 2일 때도 이친수는 한 개인 것을 알 수 있다.

    메모장에 이렇게 간단하게라도 각 N자리를 풀어보면 다음과 같은 관계를 알 수 있다.

    D[i] = D[i-1] + D[i-2] 

    젠장.. 이번에도 피보나치다

     

    다만 유의해야할 점이 하나 있는데, vector을 <int>형으로 선언하게 되면 46항의 부분에서 int 형의 범위를 초과한다. 그 이유는 피보나치 수의 계산이 일정 이상 지속되면 int 범위를 초과하기 때문이다.

     

    따라서 피보나치가 감당하기 어려운 숫자가 나올 것 같다면 int형 대신 long long 형을 사용해보자.

     

     

     

     

     

    댓글