Boostcamp AI Tech

[Boostcamp 과제 - 5] morsecode

ju_young 2021. 8. 6. 00:40
728x90

해당 과제는 모스 부호를 문자열로 변환하거나 문자열을 모스 부호로 변환해주는 프로그램을 작성하는 과제이다.

Import

일단 문자열을 다루는 부분이 많기 때문에 re를 import하여 정규표현식을 사용하였다.

import re

is_help_command

입력받은 문자를 소문자로 변환 후 'h' 또는 'help'면 True를 반환해준다.

def is_help_command(user_input):
    return user_input.lower() in ['h', 'help']

is_validated_english_sentence

일단 띄어쓰기는 빈 문자열로 변환하였다. 그 후 입력받은 문자에 문자와 .,!?를 제외한 나머지가 있으면 False를 반환해야한다. 또한 .,!?로만 이루어진 문자도 안된다. 따라서 re함수를 사용해 문자와 .,!?를 제외한 나머지가 하나도 없으면 정상적인 문자이고 .,!?를 제외한 나머지가 있으면 .,!?만 이루어진 문자가 아니라는 것으로 구현하였다.

def is_validated_english_sentence(user_input):
    user_input = user_input.replace(' ', '')
    return len(re.findall('[^a-zA-Z.,!?]', user_input)) == 0 and len(re.findall('[^.,!?]', user_input)) > 0 ## .,!?만 있을 때

is_validated_morse_code

입력받은 모스 부호로된 문자가 정말 모스 부호로 이루어진 문자인지 확인하는 함수이다. 우선 get_morse_code_dict()함수로 모스부호 dict를 불러왔고 불러온 dict에 각 모스부호가 안에 들어가 있는지 확인하는 방법으로 구현하였다.

def is_validated_morse_code(user_input):
    morse_code = get_morse_code_dict()
    for code in user_input.split():
        if code not in morse_code.values():
            return False
    else:
        return True

get_cleaned_english_sentence

입력받은 문자가 문자로만 이루어져있는지 확인하는 함수이다. re함수를 사용하여 영문자, 숫자를 포함하는 문자만 찾아서 join으로 합쳤다.

def get_cleaned_english_sentence(raw_english_sentence):
    return ' '.join(re.findall('[a-zA-Z0-9]+', raw_english_sentence))

decoding_character

모스부호 하나를 문자로 바꾸는 함수이다. 불러온 모스 부호의 dict를 items()로 key와 value를 받은 후 모스부호와 value값이 동일하면 해당 key를 가져오는 방법으로 구현하였다.

def decoding_character(morse_character):
    #모스부호 -> 문자
    morse_code_dict = get_morse_code_dict()
    for k, v in morse_code_dict.items():
        if v == morse_character:
            return k

encoding_character

문자 하나를 모스부호로 바꿔주는 함수이다. 이 또한 dict를 불러와서 바로 대문자로 변환해서 value 값을 가져왔다.

def encoding_character(english_character):
    #문자 -> 모스부호
    morse_code_dict = get_morse_code_dict()
    return morse_code_dict[english_character.upper()]

decoding_sentence

모스 부호로 이루어진 문장을 문자열로 바꿔주는 함수이다. 일단 띄어쓰기 두 번이 문자를 나누는 기준이므로 띄어쓰기 두 번을 기준으로 split()을 사용해 나누어주었다. 그러면 띄어쓰기 한 번으로 각 모스부호가 나눠지므로 한 번 더 split()을 한 후 각 모스부호를 문자로 바꿔주는 방법을 사용하였다. 그러면 문자로된 리스트가 될 것이고 join으로 합치면 하나의 단어가 될 것이다. 이 단어를 result라는 변수에 붙여주고 띄어쓰기까지 해주는 식으로 반복하였다. 모두 진행되면 마지막에 띄어쓰기가 하나 더 남는데 이 부분을 없애기위해 [:-1]로 제외시켜주었다.

def decoding_sentence(morse_sentence):
    #모스 부호 -> 문자
    morse_sentence = morse_sentence.split('  ') # 띄어쓰기 = "  "
    result = ''
    for sentence in morse_sentence:
        word_list = sentence.split() #코드로 이루어진 list
        for i in range(len(word_list)):
            word_list[i] = decoding_character(word_list[i]) #코드 -> 문자 replace
        result += ''.join(word_list) + ' '
    return result[:-1] #마지막 빈칸 제외

encoding_sentence

문자는 띄어쓰기로 나눠져있으므로 split()으로 단어 리스트를 만들어주었다. 그리고 각 문자를 모스부호로 변환하고 끝에 띄어쓰기를 해주었다. 해당 문자가 끝나면 띄어쓰기 두 번으로 구분해주어야되므로 띄어쓰기를 한 번더 뒤에 추가해주었다. 모두 진행이 되면 마지막에 띄어쓰기 두 개가 남으므로 [:-2]라고 슬라이싱해주었다.

def encoding_sentence(english_sentence):
    #문자 -> 모스 부호
    english_sentence = get_cleaned_english_sentence(english_sentence).split()
    result = ''
    for word in english_sentence:
        for s in word:
            result += encoding_character(s) + ' '
        result += ' ' # 띄어쓰기
    return result[:-2] #마지막 띄어쓰기로 표현된 "  " 제외

main

  • 먼저 문자를 입력받을 수 있게 input 함수를 사용한다.
  • 0이 입력받으면 종료되게 break를 지정한다.
  • help를 입력받으면 get_help_message()를 print해준다.
  • is_validated_english_sentence()으로 올바른 영문자로 이루어진 문장이라면 encoding_sentence()을 실행한다.
  • 그게 아니고 is_validated_morse_code()으로 올바른 모스부로로 이루어진 문장이라면 decoding_sentence()을 실행한다.
  • 잘못된 값이면 'Wrong Input'을 print해준다.
def main():
    print("Morse Code Program!!")
    
    while True:
        user_input = input("Input your message(H - Help, 0 - Exit) : ")
    
        #종료
        if user_input == '0':
            break
        
        #Help
        if is_help_command(user_input):
            print(get_help_message())
        
        if is_validated_english_sentence(user_input):
            print(encoding_sentence(user_input))
        elif is_validated_morse_code(user_input):
            print(decoding_sentence(user_input))
        else:
            print('Wrong Input')

    
    print("Good Bye")
    print("Morse Code Program Finished!!")

if __name__ == "__main__":
    main()
728x90