PS/BaekJoon

[BaekJoon 2193번] 이친수(C++)

박땅콩 2022. 8. 16.
728x90

※주의※

저의 풀이가 정답은 아닙니다.

다른 코드가 더 효율적이거나 좋을 수 있습니다.

언제나 다른 사람의 코드는 참고만 하시기 바랍니다.

 

 

[문제 풀이 사이트]

 

 

 

2193번: 이친수

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

www.acmicpc.net

 

 

[문제 설명]

 

 

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

이친수는 0으로 시작하지 않는다.
이친수에서는 1이 두 번 연속으로 나타나지 않는다. 즉, 11을 부분 문자열로 갖지 않는다.
예를 들면 1, 10, 100, 101, 1000, 1001 등이 이친수가 된다. 하지만 0010101이나 101101은 각각 1, 2번 규칙에 위배되므로 이친수가 아니다.

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

 

 

[입력]

 

첫째 줄에 N이 주어진다.

 

[출력]

 

 

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

 

 

[입출력 예]

 

 

입력 출력
3 2

 

 

[문제 풀이]

 

 

DP 문제이다. 쉽게 점화식을 구할 수 있었다.

N의 범위가 1에서 90까지이기 때문에 자료형을 unsigned long long으로 설정했다.

 

 

1. 테이블을 정의한다.

dp[N] = N자리 이친수의 개수

단 이친수는 0으로 시작하지 않는다.

이친수는 1이 두번 연속으로 나타나지 않는다. 즉, 11을 부분 문자열로 갖지 않는다.

 

 

2. 점화식을 정의한다.

 

N = 1 N = 2 N = 3 N = 4 N = 5
1 10 100
101
1000
1010
1001
10000
10100
10010
10101
10001

 

N = 3일 때를 보면

N = 2일 때의 방법에  0을 붙임

N = 1일 때의 방법에 01을 붙임

➔ 100, 101

 

N = 4일 때를 보면

N = 3일 때의 방법에 0을 붙임

N = 2일 때의 방법에 01을 붙임

➔ 1000, 1010, 1001

 

위 내용을 기반으로

dp[N] = dp[N - 1] + dp[N - 2] 로 점화식을 정의할 수 있다.

 

3. 초기값을 정의한다.

 

초기값은 dp[1] = 1, dp[2] = 1로 정의한다.

 

 

[최종 코드]

 

 

[GitHub]

 

 

 

GitHub - SmallPeanutPark/BAEKJOON: Study BaekJoon for Coding Test

Study BaekJoon for Coding Test. Contribute to SmallPeanutPark/BAEKJOON development by creating an account on GitHub.

github.com

 

 

#include <bits/stdc++.h>
using namespace std;
using ull = unsigned long long;

ull dp[91];

ull searchPinaryNumber(ull n) {
    if(dp[n] != 0) return dp[n];
    else {
        return dp[n] = searchPinaryNumber(n - 1) + searchPinaryNumber(n -2);
    }
}

int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    ull N; // N자리 
    cin >> N;
    fill(dp, dp + 91, 0);
    dp[1] = 1;
    dp[2] = 1;
    cout << searchPinaryNumber(N);
    return 0;
}
728x90

댓글