티스토리 뷰

Algorithm

[알고리즘] 백준 이친수 2193 DP

감자형 2019. 4. 19. 02:45

안녕하세요 감자코딩에 감자 개발자 입니다. 이번에 살펴볼 문제는 DP 문제인 이친수 문제입니다.

  1. 문제
이친수 성공
시간 제한메모리 제한제출정답맞은 사람정답 비율

2 초    128 MB    34368    13003    9725    36.158%
문제
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 복사
3

예제 출력 1 복사
  1. 해결 방법

1) 키워드

이친수는 0으로 시작하지 않는다.
이친수에서는 1이 두 번 연속으로 나타나지 않는다. 즉, 11을 부분 문자열로 갖지 않는다.
예를 들면 1, 10, 100, 101, 1000, 1001 등이 이친수가 된다. 하지만 0010101이나 101101은 각각 1, 2번 규칙에 위배되므로 이친수가 아니다.

이 조건이 가장 중요한 것인데요.
문제를 풀이 해보겠습니다.

  • 이친수는 0으로 시작하지 않는다고 했으니까 결국엔, 1로 시작하겠다는 말이지요? (여기서 0,1로 이진수처럼 사용한다고 하였으니까 경우의 수는 0,1 입니다)

  • N의 경우에서 부터 알아보겠습니다.

점화식을 살펴보겠습니다.(TOP - DOWN 방식)
D[n] = n;
N일 경우에 들어 갈 수 있는 경우의 수는 0,1 입니다.
그러면 N = 0,1 일경우를 살펴 보겠습니다.

N = 0 일경우( 1 0 , 0 0 )

N-1 에는 1, 0 두가지 경우가 올 수 있습니다. 인접한값이 11 연속되지 않기 때문이죠.
N-1 = 0 이면
N-2의 경우에 N-2의 값은 1,0 이 올 수 있습니다.

N = 1일 경우 (0 1)

N-1 에는 0 한가지의 경우만 올 수 있습니다. (10) N-1에는 1이 올 수 없죠. 인접값이 11이 되기 때문이죠.
N-1 = 1 이면 
N-2 의 경우에 1의 값만 올 수 있습니다.

....
...
N = ......1

이제 여기서 문제를 점화식으로 도출 할 수 있다고 생각을 하셨나요?

N-1 에서 2가지가 올 수 있고, N-2 에서 1가지의 경우가 올 수 있다는 사실.
그러면 계속해서 N-3, N-4를 진행하면 계속해서 N-1, N-2의 식이 도출되면서 진행하게 되면서
1의 값을 만나게 되면 값을 종료한다면 최종적으로 이친수의 값을 구할 수 있겠죠?
N-1 , N -2 의 점화식 어디서 많이 본 점화식이죠 ? 네 , 맞습니다. 피보나치 수열과 같은 점화식이네요.
하지만, 약간의 도출조건이 다른것만 생각만 잘해주시면 됩니다.

최종적으로 도출한 점화식

D[n] = D[n-1] + D[n-2] 
  1. 소스코드

#include <stdio.h>
#include <stdio.h>
#include <vector>
#include <iostream>
using namespace std;  
int dp\[91\];

int main(void){


int n;
cin >> n;

dp[1] = 1;      // 이친수는 0으로 시작하지 않으므로 1값
dp[2] = 1;
// 저장된 값으로 부터 시작해서 dp순회
for(int i=3; i<=n; i++){
    dp[i] = dp[i-1] + dp[i-2];
}

cout << dp[n] <<"\n";

return 0;
}

이상 알고리즘 PS 감자코딩에 감자개발자였습니다. 감사합니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함