문제
0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수(pinary number)라 한다. 이친수는 다음의 성질을 만족한다.
- 이친수는 0으로 시작하지 않는다.
- 이친수에서는 1이 두 번 연속으로 나타나지 않는다. 즉, 11을 부분 문자열로 갖지 않는다.
예를 들면 1, 10, 100, 101, 1000, 1001 등이 이친수가 된다. 하지만 0010101이나 101101은 각각 1, 2번 규칙에 위배되므로 이친수가 아니다.
N(1 ≤ N ≤ 90)이 주어졌을 때, N자리 이친수의 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다.
출력
첫째 줄에 N자리 이친수의 개수를 출력한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
package backjoon_2193;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int l = Integer.parseInt(br.readLine());
long[] dp = new long[l+1];
dp[0] = 0;
dp[1] = 1;
for(int i = 2; i<=l;i++) {
dp[i] = dp[i-1]+dp[i-2];
}
System.out.println(dp[l]);
}
}
|
cs |
이 문제도 DP 관련 문제다. DP의 가장 큰 문제점은 뭐냐면 내가 DP인지 알지 못하겠다는 거다. 지금은 DP라고 생각하고 풀겠지만, 실전 상황에서 이걸 DP문제라고 생각할 수 있을지 의문이 든다.
DP로 풀면 문제는 엄청 간단해진다. 길이가 0이라면 아무런 이찬수가 존재하지 않으니 0으로 설정, 1이라면 개수는 1뿐이다. i인 이친수열은 이전 길이 [i-1]과 [i-2]인 이친수열을 결합한 결과이다. 그러니 다음 부터는 for문을 통해 찾아나가면 된다.
DP로 풀면 이렇게 쉽게 풀리는 문제를 내가나중에도 이게 dp라고 생각할 수 있을까?하는 의문이 들었다.
'java' 카테고리의 다른 글
[java] 2738번 행렬 덧셈 (0) | 2024.03.21 |
---|---|
[java] 2563 색종이 (0) | 2024.03.19 |
[java] 2869 달팽이는 올라가고 싶다 (1) | 2024.01.05 |
[java] 10844 쉬운 계단 수 (0) | 2024.01.04 |
[java] 11718 그대로 출력하기 (0) | 2024.01.02 |