문제 링크 : https://www.acmicpc.net/problem/2011
암호코드 성공
문제상근이와 선영이가 다른 사람들이 남매간의 대화를 듣는 것을 방지하기 위해서 대화를 서로 암호화 하기로 했다. 그래서 다음과 같은 대화를 했다.
어떤 암호가 주어졌을 때, 그 암호의 해석이 몇 가지가 나올 수 있는지 구하는 프로그램을 작성하시오. 입력첫째 줄에 5000자리 이하의 암호가 주어진다. 출력나올 수 있는 해석의 가짓수를 구하시오. 정답이 매우 클 수 있으므로, 1000000으로 나눈 나머지를 출력한다. 예제 입력 125114 예제 출력 16 |
[ 문제 풀이 ]
D[i] = 왼쪽에서부터 i번째 자리까지 썼을 때, 나올 수 있는 암호의 경우의 수
D[i] = D[i-1]
만약, input[i-1]과 input[i]가 10 이상 26이하이면, D[i] = D[i-2]도 더해주어야한다.
ex) O O O O 2 5의 경우,
D[6] = D[5] ---> O O O O O 5
D[6] = D[6] + D[4] ---> O O O O 2 5
역시 D[0] = 1임에 유의한다. 경우의 수라서...
[ 최종 구현(C++) ]
#include <stdio.h> char input[5002] = { 0 }; int D[5002] = { 0 }; int main(void) { int i = 1; scanf("%s", input + 1); D[0] = 1; while (input[i] != '\0' && input[i] != '\n') { int x = input[i] - '0'; if (1 <= x && x <= 9) { D[i] = (D[i] + D[i - 1]) % 1000000; } if (i == 1) { i++; continue; } if (input[i - 1] == '0') { i++; continue; } x = (input[i - 1] - '0') * 10 + (input[i] - '0'); if (10 <= x && x <= 26) { D[i] = (D[i] + D[i - 2]) % 1000000; } i++; } printf("%d\n", D[i - 1]); return 0; }
'Algorithm > 문제풀이' 카테고리의 다른 글
[Brute Force - 재귀] 부분 수열의 합 (0) | 2019.09.18 |
---|---|
[이분탐색] 중량 제한 (0) | 2019.09.03 |
[어려움][다이나믹 프로그래밍] 합분해 (0) | 2018.08.13 |
[주의][다이나믹 프로그래밍] 타일 채우기 (0) | 2018.08.13 |
[다이나믹 프로그래밍] 제곱수의 합 (0) | 2018.08.13 |