https://www.acmicpc.net/problem/2193
2193번: 이친수
0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수(pinary number)라 한다. 이친수는 다음의 성질을 만족한다. 이친수는 0으로 시작하지 않는다. 이친수에서는 1이 두 번 연속으로 나타나지 않는다. 즉, 11을 부분 문자열로 갖지 않는다. 예를 들면 1, 10, 100, 101, 1000, 1001 등이 이친수가 된다. 하지만 0010101이나 101101은 각각 1, 2번 규칙에 위배되
www.acmicpc.net
문제는 백준 알고리즘 사이트를 참조하세요
먼저 분석과 설계를 하고 시작할게요
Pinary Number
1 - 0으로 시작하지 않는 수
2 - 1이 두번 연속으로 나오지 않는 수
를 이친수라고 하네요.
문제에서 요구하는 것은1 부터 90까지 주어지는 N에 대해서 N자리 이친수의 개수를 구하는 거네요!
그럼 이 사실로부터 앞이 1이면 뒤는 무조건 0이어야하고, 앞이 0이면 뒤는 1 혹은 0이 올 수 있다는 것을 알 수 있겠네요 오호~
이것을 그림으로 표현하면
이렇게 표현할 수 있습니다.
그리고 구해야하는 정답이 이친수의 개수라고 했으므로 재귀를 이용하거나 배열을 사용한 동적 프로그래밍을 하는게 맞겠네요.
그런데 90번째 이친수를 재귀적으로 구하려면 시간이 초과되겠죠??
동적 프로그래밍을 합시다.
지금까지는 앞에서 뒤 방향으로 관찰했었는데요. 잘 보면 0은 0이나 1에서 올 수 있고, 1은 무조건 0에서 밖에 못 온다는 것을 알 수 있습니다.
빨간색 선으로 표시된 부분에서 새로운 경우의 수가 발생하는거죠.
이것을 재귀적으로 표현하면 다이나믹 프로그래밍이 완성됩니다.
pinary number[i][0] = pinary number[i - 1][0] + pinary number[i - 1][1];
pinary number[i - 1][1] = pinary number[i - 1][0];
마칩니다~
'Algorithms > Baekjoon Algorithms' 카테고리의 다른 글
알고리즘 설계 - 동적계획법 (Dynamic Programming) (0) | 2019.06.26 |
---|---|
백준 알고리즘 2655 - 가장 높은 탑 쌓기 (0) | 2019.06.26 |
백준 알고리즘 2098 - 외판원 순회 (The Traveling Salesperson Problem) (0) | 2019.06.25 |
백준 알고리즘 2156 문제 - 포도주 시식 (0) | 2019.06.24 |
알고리즘 글을 쓰려고 합니다. (0) | 2019.06.22 |