Programming 기초/Python
[Python 자료구조 #트리2] 모르스 코드 결정트리
코딩상륙작전
2023. 5. 25. 14:25
* 이진트리의 응용 : 모르스 코드 결정트리
- 모르스 부호는 도트(점)와 대시(선)의 조합으로 구성된 메시지 전달용 부호로 1830년대에 미국의 사뮤엘 모르스(Samuel Morse)에 의해 고안되었다.
- 결정트리는 여러 단계의 복잡한 조건을 갖는 문제에 대해 조건과 그에 따른 해결방법을 트리 형태로 나타낸 것을 말한다.
- 결정트리를 이용하면 알파벳을 찾는데 걸리는 시간은 O(log_2 n)이다.
table =[('A', '.-'), ('B', '-...'), ('C', '-.-.'), ('D', '-..'),
('E', '.'), ('F', '..-.'), ('G', '--.'), ('H', '....'),
('I', '..'), ('J', '.---'), ('K', '-.-'), ('L', '.-..'),
('M', '--'), ('N', '-.'), ('O', '---'), ('P', '.--.'),
('Q', '--.-'), ('R', '.-.'), ('S', '...'), ('T', '-'),
('U', '..-'), ('V', '...-'), ('W', '.--'), ('X', '-..-'),
('Y', '-.--'), ('Z', '--..') ]
class TNode:
def __init__(self, data, left, right):
self.data = data
self.left = left
self.right = right
def make_morse_tree():
root = TNode(None, None, None)
for tp in table: # table에 있는 요소 하나 하나씩 넣음.
code = tp[1] # 모르스 코드 table 한 요소의 모르스 코드를 넣음
node = root
for c in code: # 맨 마지막 문자 이전까지 -> 이동
if c == ".": # 점(.): 결정트리에서 왼쪽으로 이동
if node.left == None: # 비었으면 빈 노드 만들기
node.left = TNode(None, None, None)
node = node.left # 그쪽으로 이동
elif c == "-": # 오른쪽으로 이동
if node.right == None: # 비었으면 빈 노드 만들기
node.right = TNode(None, None, None)
node = node.right # 그쪽으로 이동
node.data = tp[0] # 코드의 알파벳을 해당 노드에 넣음.
return root
def decode(root, code): # 모르스 코드에 대한 문자를 찾는 함수
node = root
for c in code:
if c == ".":
node = node.left
elif c == "-":
node = node.right
return node.data
def encode(ch): # 문자에 대한 코드를 찾아 반환하는 함수
idx = ord(ch) - ord("A") # 예로 C의 코드를 찾는다고하면 C(67)-A(65)=2
return table[idx][1] # C의 코드는 table[2][1]에 해당한다.
morseCodeTree = make_morse_tree()
str = input("입력 문장 : ") # 알파벳 대문자만 입력가능. 그 외 오류
mlist = []
for ch in str:
code = encode(ch)
mlist.append(code)
print("Morse Code: ", mlist)
print("Decoding : ", end="")
for code in mlist:
ch = decode(morseCodeTree, code)
print(ch, end="")
print()
--------------------------------------------------
입력 문장 : GAMEOVER
Morse Code: ['--.', '.-', '--', '.', '---', '...-', '.', '.-.']
Decoding : GAMEOVER