https://www.acmicpc.net/problem/2193
2193번: 이친수
0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수(pinary number)라 한다. 이친수는 다음의 성질을 만족한다. 이친수는 0으로 시작하지 않
www.acmicpc.net
2차원 다이나믹 배열 이용(변수 두개 사용)
D[ N ][ L ] = D [ 자리수 ] [ 마지막수 ]라 했을 때,
경우의 수를 나누어서 생각해보자.
1) 마지막 자리에 0이 오는 경우 => D[ N ][ 0 ] = D[ N - 1 ][ 0 ] + D[ N - 1 ][ 1 ]
2) 마지막 자리에 1이 오는 경우 => D[ N ][ 1 ] = D[ N - 1 ][ 0 ]
두가지 경우의 수가 있다.
그럼 초기값을 어떻게 설정하면 좋을까?
길이가 가장 짧은 이친수는 길이가 1이라고 할 수 있다. 0 또는 1
1) D[ 1 ][ 0 ] = 0 => 문제에서 이친수는 0으로 시작하지 않는다는 조건이 있기때문에 초기값은 0에 해당한다.
2) D[ 1 ][ 1 ] = 1
1차원 다이나믹 배열 이용(변수 하나 사용)
해당 문제는 0 과 1만 사용하기 때문에 1차원 다이나믹 배열을 이용 할 수 있다.
D[ N ] = N 자리 이친수 라고 해보자.
1) N 자리 이친수가 마지막이 0 인경우 => N - 1 자리수에 올 수 있는 수는 0 또는 1 이다.
즉, D[ N - 1] 자리의 이친수를 만들고 0을 붙이면 되기때문에 D [ N ] = D[ N - 1] 이 된다.
2) N 자리 이친수가 마지막이 1 인경우 => N - 1 자리수에 올 수 있는 수는 0 이다.
즉, D[ N - 1] 에는 무조건 0이오고 D[ N - 2] 에는 0 또는 1이 올 수 있기때문에 D [ N ] = D[ N - 2] 이 된다.
1차원 다이나믹 배열을 이용하여 풀이한 코드
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
long[] d = new long[n+2];
d[1] = 1; //1자리 이친수는 1만 가능 (이친수는 0으로 시작하지 않는다는 문제 조건)
d[2] = 1; //2자리 이친수는 10만 가능 (이친수는 0으로 시작하지 않고, 11이 연속되지 않는다는 문제 조건)
for(int i = 3; i <= n; i++) {
d[i] = d[i-1] + d[i-2];
}
System.out.println(d[n]);
}
}
'개발 > 알고리즘' 카테고리의 다른 글
프로그래머스 행렬 테두리 회전하기 (0) | 2021.07.05 |
---|---|
프로그래머스 순위검색 C++ (0) | 2021.07.02 |
백준 10844 쉬운 계단 수 (0) | 2021.06.29 |
백준 15661 링크와 스타트 (0) | 2021.06.25 |
백준 14891 톱니바퀴 (0) | 2021.06.24 |