본문 바로가기
알고리즘/DP

[java 백준] 실버3/2193번 이친수

by Meaning_ 2021. 8. 1.
728x90
반응형


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

 

2193번: 이친수

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

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
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class Main {
 
    public static int n;
    public static long[][] dp;
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        n = Integer.parseInt(br.readLine());
        dp = new long[n + 1][2];
        dp[1][1= 1;
        dp[1][0= 0;
 
        for (int i = 2; i <= n; i++) {
            for (int j = 0; j < 2; j++) {
                if (j == 0) {
                    dp[i][j] = dp[i - 1][0+ dp[i - 1][1];
                } else {
                    dp[i][j] = dp[i - 1][0];
                }
            }
 
        }
        long count = 0;
        for (int j = 0; j < 2; j++) {
            count += dp[n][j];
 
        }
        System.out.println(count);
 
    }
 
}
cs

 

이 문제는 다른 dp 문제들 처럼 합하는게 중요한 문제였는데, 어떻게 합하는가가 핵심인 문제였다.

2차원 배열 dp를 만들어준다. dp[1][0]=0의 의미는 1의 경우 한자리 즉, 자리수를 의미하고 0은 그 정수의 맨 끝에 있는 수가 0이라는 것을 의미한다. 

한 자리수인 이친수는 1 밖에 없고 0으로 끝나지 않으므로 dp[1][0]=0이다.

이런 방식으로 n까지 구해나가면 된다. 

 

풀면서 잘못 생각한 부분


 

나는 규칙을 잘못 생각했다.  처음 생각해낸 코드는

1
2
3
4
5
6
7
8
9
if(dp[i-1][0]>=1){
   dp[i][0]=dp[i-1][0]+1;
   dp[i][1]=dp[i-1][0]+1;
}
if (dp[i-1][1]>=1){
   dp[i][0]=dp[i-1][1]+1;
   dp[i][1]=dp[i-1][0];
}
 
cs

만약 i-1자리수에 맨 끝이 0 인 경우가 하나 이상 있다면, i자리 수의 맨끝이 0인경우와 1인 경우에 각각 하나씩 더해주지만,

i-1번째 자리수의 맨끝이 1인 경우가 하나 이상 있다면, i자리 수의 맨끝이 1인경우에만 하나를 더해주는 식으로 구현을 했다. 

하지만 이렇게 하면 문제점은 n이 6일 때 부터 규칙에 맞지 않는 다는 것이였다. 

 

결국 규칙은 

dp[i][0]=dp[i-1][0]+dp[i-1][1]

dp[i][1]=dp[i-1][0]

 

이였다. 

 

생각보다 규칙은 굳이 복잡하게 생각할 이유가 없고, 간결했고, 앞서 말했던 것 처럼 합하는 규칙을 잘 찾아내는 것이 중요했다. 

또한 dp에서의 규칙은 점화식으로 간결하게 표현될 수 있다!

728x90
반응형

댓글