문제출처 : 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

+ Recent posts