티스토리 뷰

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

 

2193번: 이친수

0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수(pinary number)라 한다. 이친수는 다음의 성질을 만족한다. 이친수는 0으로 시작하지 않는다. 이친수에서는 1이 두 번 연속으로 나타나지 않는다. 즉, 11을 부분 문자열로 갖지 않는다. 예를 들면 1, 10, 100, 101, 1000, 1001 등이 이친수가 된다. 하지만 0010101이나 101101은 각각 1, 2번 규칙에 위배되

www.acmicpc.net

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
public class Main {
 
    public static void main(String[] args) throws NumberFormatException, IOException {
        // TODO Auto-generated method stub
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int length = Integer.parseInt(br.readLine());
        
        int[] dp = new int[length+1]; //편의를 위하여 배열의 길이를 이진수 길이보다 1 크게 만든다.
                                      //-> 10번째 숫자이면 dp[9]를 접근하는게 맞으나 dp[0]을 버림으로써 인덱스 넘버가 곧 순서가 되게끔 하기 위하여 
        dp[0]=0;
        dp[1]=1;
        
        for(int i=2;i<=length;i++) {
            dp[i]=dp[i-1]+dp[i-2];
        }
        System.out.println(dp[length]);
 
    }
 
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
" target="_blank" style="text-decoration:none; color:white">cs
에qodufdms 

dp배열은 n자리 이친수를 나타낸다.

n번째에 0이 들어간 이친수의 갯수는 n-1번째에 1혹은 0모두 들어갈 수 있다.  그러므로 dp[n-1]과 값이 같다.

그러나 n번째에 1이 들어가게 되면 n-1번째에는 반드시 0이 들어가야하고, n-2번째에 1 혹은 0이 모두 들어갈 수 있어 dp[n-2]와 같게 된다. 

그리하여 dp[n]=dp[n-1]+dp[n-2]로 해결할 수 있게 된다. 

댓글