문제 풀이/Baekjoon Online Judge

[Baekjoon Online Judge] 2193번: 이친수

hyeonic 2021. 2. 2. 21:57
 

2193번: 이친수

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

www.acmicpc.net

요구사항 

- 01로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수라 한다.
  - 이친수는 0으로 시작하지 않는다.
  - 이친수는 1이 두 번 연속 나타나지 않는다. , 11을 부분 문자열로 갖지 않는다.

입력

 - 첫째 줄에 N이 주어진다. N(1 ≤ N ≤ 90)

출력

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


 우선 간단한 규칙을 찾기 위해서 N의 범위에 맞춰 만족하는 이친수의 개수를 세보았다.

 

N 자리 이친수 이친수의 개수
1 1 1
2 10 1
3 100, 101 2
4 1000, 1001, 1010 3
5 10000, 10001, 10010, 10100, 10101 5
6  ... 8?

 

 이친수의 개수에 대한 규칙을 찾아보니 쉽게 피보나치 수인 것을 알 수 있었다. 

 

 한가지 더 고려해야 할 점은 N은 최소 1 부터 최대 90 자리를 가질 수 있기 때문에 자리수가 커질 수록 이친수의 개수는 기하급수적으로 늘어날 것으로 예상했다. 그렇기 때문에 dp 테이블의 데이터 타입을 long으로 코드를 작성하였다.

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Baekjoon2193 {

    public static void main(String[] args) throws IOException {

        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out));

        int n = Integer.parseInt(bufferedReader.readLine());
        long[] dp = new long[n + 1];

        for (int i = 1; i <= n; i++) {
            if (i == 1 || i == 2) dp[i] = 1;
            else dp[i] = dp[i - 1] + dp[i - 2];
        }

        bufferedWriter.write(String.valueOf(dp[n]));

        bufferedWriter.flush();
        bufferedReader.close();
        bufferedWriter.close();
    }
}

 

 규칙을 찾으면 쉽게 해결할 수 있는 문제였다.

댓글수0