본문 바로가기

파이썬 알고리즘 풀이

63)알파코드(DFS)

문제

위와 같은 영희의 방법으로 암호화된 코드가 주어지면 그것을 알파벳으로 복원하는데 얼마나 많은 방법이 있는지 구하기

 

조건

철수와 영희는 서로의 비밀편지를 암호화해서 서로 주고받기로 했다. 그래서 서로 어떻게 암호화를 할 것인지 의논을 하고 있다.

 

영희 : 우리 알파벳 A에는 1로, B에는 2로 이렇게 해서 Z에는 26을 할당하여 번호로 보내기 로 하자.

 

철수 : 정말 바보같은 생각이군!! 생각해 봐!! 만약 내가 “BEAN"을 너에게 보낸다면 그것을 암호화하면 25114이잖아!! 그러면 이것을 다시 알파벳으로 복원할 때는 많은 방법이 존재하는 데 어떻게 할건데... 이것을 알파벳으로 바꾸면 BEAAD, YAAD, YAN, YKD 그리고 BEKD로 BEAN말고도 5가지나 더 있군.

 

제한사항

첫 번째 줄에 숫자로 암호화된 코드가 입력된다. (코드는 0으로 시작하지는 않는다, 코드의 길 이는 최대 50이다) 0이 입력되면 입력종료를 의미한다.

 

입력된 코드를 알파벳으로 복원하는데 몇 가지의 방법이 있는지 각 경우를 출력한다. 그 가지 수도 출력한다. 단어의 출력은 사전순으로 출력한다.

 

문제풀이

def go(L, P):
  global cnt

  if L==N:
    cnt+=1
    for i in range(P):
      print(chr(res[i]+64), end=' ')
    print()
  else:
    for i in range(1, 27):
      if code[L]==i:
        res[P]=i
        go(L+1, P+1)
      elif i>=10 and code[L]==i//10 and code[L+1]==i%10:
        res[P]=i
        go(L+2, P+1)

code=list(map(int, input()))
N=len(code)
code.insert(N, -1)
res=[0]*N
cnt=0
go(0, 0)
print(cnt)

'파이썬 알고리즘 풀이' 카테고리의 다른 글

65)사과나무(BFS)  (0) 2021.11.09
64)송아지 찾기(BFS: 상태트리탐색)  (0) 2021.11.09
62)동전 분배하기(DFS)  (0) 2021.11.08
61)동전 바꿔주기(DFS)  (0) 2021.11.08
60)양팔저울(DFS)  (0) 2021.11.08