문제출처 : https://www.acmicpc.net/problem/2011
1. 문제요약
- 알파벳 A ~ Z를 숫자 1 ~ 26에 대응 하여 암호를 만듦
- 25114 라는 암호를 만들었을 때, 해석 되는 가짓수는?
- 암호의 길이 N
- 1 <= N <= 5,000
2. 접근방법
- 길이가 n일 때, i 번째 숫자 까지 해석되는 경우의 수를 d[i]
- 최대 두 글자가 합쳐 질 수 있으므로
d[i] = d[i-1] + d[i-2]
- 단, 0이 포함되어 있거나, 26을 넘어가는 숫자는 제외
- 01 인 경우, 숫자 0은 해석할 수 없으므로 d[1] = 0
- 10 인 경우, 숫자 1은 해석할 수 있으므로 d[1] = 1
숫자 0은 해석할 수 없으므로 1과 0은 따로 해석할 수 없고, 10은 해석 가능하므로 d[2] = 1
- 45 인 경우, 숫자 4, 5는 따로 해석 가능하지만, 45는 해석 할 수 없음. d[1] = 1, d[2] = 1
- 즉, 한 자릿수는 0 이외면 d[i] += d[i-1]
두 자릿수는 10이상 26 이하면 d[i] += d[i-2]
3. 시간복잡도
- n
4. 회고
- 아에 생각을 잘못함...
- 0 0 0 0 0
/ \
0 | 0 0 0 0 0 | 0 0 0
- 이런식으로 나눠서 제일 마지막에
1개가 남고 0이 아니면 return 1
2개가 남고 0이상 27 이하 이면 return 2
X0 인 경우 return 1
0X 인 경우 return 0
27 이상 return 0
- 이렇게 나눠서 생각했음
너무 복잡하고 3333333 인경우 못골라냄...
- long long 은 약 18자릿수 까지 밖에 저장 못함...
- 5000 자릿수는 문자열로 받아야 함
string 숫자를 int 숫자로 변환은 c[0] - '0'
- 넘 소스코드 좀 보자
- 난 n[i]와 d[i]의 인덱스를 같이 쓸려고 했는데
같이 쓰면 d[1]일때 문자 2개의 경우의 수를 판단해야 되서 line 15와 같이 삽입했는데 그러지 말고
d[n] : 길이 n번째 까지 만들 수 있는 암호의 수 라고 하면
d[1]이 a[0]로 만들 수 있는 암호의 수가 되어서 line 15를 쓸 필요가 없었네
소스코드 : 맞은 소스
소스코드 : 틀린 소스
[출처 : BOJ, 문제에 대한 모든 권리는 BOJ(acmicpc.net, startlink)에 있음]
'먹고살려면 > boj' 카테고리의 다른 글
BOJ 1260 DFS와 BFS (0) | 2018.01.26 |
---|---|
BOJ 11052 붕어빵 판매하기 (0) | 2018.01.25 |
BOJ 2225 합분해 (0) | 2018.01.25 |
BOJ 9461 파도반 수열 (0) | 2018.01.24 |
BOJ 1966 제곱수의 합 (0) | 2018.01.23 |