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일 때 부터 규칙에 맞지 않는 다는 것이였다.
결국 규칙은
![](https://blog.kakaocdn.net/dn/bjEFNY/btraL1COnIQ/kWLkytpAkv9mav0HAmEN5K/img.png)
dp[i][0]=dp[i-1][0]+dp[i-1][1]
dp[i][1]=dp[i-1][0]
이였다.
생각보다 규칙은 굳이 복잡하게 생각할 이유가 없고, 간결했고, 앞서 말했던 것 처럼 합하는 규칙을 잘 찾아내는 것이 중요했다.
또한 dp에서의 규칙은 점화식으로 간결하게 표현될 수 있다!
'알고리즘 > DP' 카테고리의 다른 글
[java 백준] 실버 1/11057번 오르막수 (0) | 2021.08.02 |
---|---|
[java 백준] 실버 1/ 10844번 쉬운 계단 수 (0) | 2021.08.01 |
[java 백준] 실버 3/ 11727번 2xn타일링 2 (0) | 2021.07.30 |
[java 백준] 실버 3/ 11726번 2 x n 타일링 (0) | 2021.07.28 |
[java 백준] 실버 3/ 9095번 1,2,3 더하기 (0) | 2021.07.28 |
댓글