문제
0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수(pinary number)라 한다. 이친수는 다음의 성질을 만족한다.
- 이친수는 0으로 시작하지 않는다.
- 이친수에서는 1이 두 번 연속으로 나타나지 않는다. 즉, 11을 부분 문자열로 갖지 않는다.
예를 들면 1, 10, 100, 101, 1000, 1001 등이 이친수가 된다. 하지만 0010101이나 101101은 각각 1, 2번 규칙에 위배되므로 이친수가 아니다.
N(1 ≤ N ≤ 90)이 주어졌을 때, N자리 이친수의 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다.
출력
첫째 줄에 N자리 이친수의 개수를 출력한다.
이차원 배열을 만들어줬다.
long[][] arr = new long[91][2];
행의 크기가 91인 이유는 N이 90까지 리미트가 걸려있기 때문이고
열의 크기가 2 인 이유는 이친수의 가장 마지막 수가 0으로 끝나는 경우는 arr[n][0]에 저장, 1로 끝나는 경우는 arr[n][1]에 저장하기 위함이다.
이친수는 무조건 1로 시작해야하고 1이 연속으로 나오면 안되므로
N이 1일때는 1
N이 2일때는 10
이므로 n이 1일때와 n이 0일때는 경우의 수 1로 저장해준다.
arr[1][1]=1;
arr[2][0]=1;
N이 3일때는 N이 2일때 나올 수 있는 경우 뒤에 0과 1이 오는 경우를 더하면 된다.
N은 3이고 맨뒤가 0이라면 앞에 오는 두자리의 끝 수는 0이거나 1이거나 상관이 없다.
arr[i][0]=arr[i-1][1]+arr[i-1][0];
하지만 N이 3일때의 맨뒤 수가 1이라면 그 뒤의 수는 1이 되면 안된다.( 이친수에서는 1이 두 번 연속으로 나타나지 않는다. )
arr[i][1]=arr[i-1][0];
이와 같은 점화식을 통해 코드를 짜면 다음과 같다.
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int n=scanner.nextInt();
long[][] arr = new long[91][2];
arr[1][1]=1;
arr[2][0]=1;
for(int i=3; i<=90; i++) {
for(int j=0; j<=1; j++) {
if(j==0) {
arr[i][0]=arr[i-1][1]+arr[i-1][0];
}
else if(j==1) {
arr[i][1]=arr[i-1][0];
}
}
}
long result =0;
for(int i=0; i<=1; i++) {
result=result+arr[n][i];
}
System.out.println(result);
}
}
'알고리즘 > 백준' 카테고리의 다른 글
백준-1912번/연속합 (java) (0) | 2024.02.19 |
---|---|
백준-11053번/가장 긴 증가하는 부분 수열 (java) (0) | 2024.02.18 |
백준-10844번/쉬운 계단 수 (java) (2) | 2024.02.13 |
백준-15990번/1, 2, 3 더하기 5 (java) (0) | 2024.02.09 |
백준-11052번/카드 구매하기 (4) | 2024.02.08 |