본문으로 바로가기

List의 원소인 단어들이 Morse Code로 바꾸었을 때,

중복되지 않은 모스 코드의 수를 반환하는 프로그램을 짜시오.

LeetCode에서 푼 문제 리스트 보기

LeetCode에서 문제 보기

github에서 코드 보기

문제 조건

알파벳 26자에 대응되는 Morse Code가 주어진다.

Morse Code에는 각 알파벳에 대응되는 Morse Code가 중복되기도 한다.

문제 풀이

주어진 Morse Code가 어떤 알파벳을 뜻하는지 정의해두기 위해서 파이썬의 dict()에 알파벳을 Key로 하고 모스 부호를 value로 하는 딕셔너리를 만들었다. 알파벳을 순회하여 출력하기 위하여 해당 문자의 아스키 코드 값을 알 수 있는 ord() 메소드를 활용하였다. 알파벳 'a'와 'z'의 아스키 코드 값이 97과 122란 점을 이용하면 for 문을 이용해서 'a'~'z'까지의 문자열을 출력하기 쉽다.

그 다음부터는 리스트의 원소인 단어들의 문자를 Key로 사용해 dict에서 Morse Code로 바꾸면 Morse Code로 만들어진 문자열이 완성된다.  집합 컨테이너인 Set()에 완성된 문자열을 넣어 중복된 결과물을 없애준다. List에 들어있는 단어들을 모두 변환하였을 때, Set에 남아있는 값들의 수를 반환하면 된다.

파이썬 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution:
    def uniqueMorseRepresentations(self, words) -> int:
        """
        fater than 97.87% of Python3
        Memory Usage : less than 5.36% of Python3
 
        ord('a') # 97
        ord('z') # 122
        """
        alpha_dict = {}
        morse_code = [".-""-...""-.-.""-.."".""..-.""--.""...."".."".---""-.-",\
                      ".-..""--""-.""---"".--.""--.-"".-.""...""-""..-""...-", \
                      ".--""-..-""-.--""--.."]
        for i in range(ord('a'), ord('z'+ 1):
 
            alpha_dict[chr(i)] = morse_code[i-ord('a')]
 
        changed_words = set()
        for word in words:
            string = ''
            for c in word:
                string += alpha_dict[c]
            if string not in changed_words:
                changed_words.add(string)
 
        return len(changed_words)
 
 
if __name__ == "__main__":
    s = Solution()
    word = ["gin""zen""gig""msg"]
    print(s.uniqueMorseRepresentations(word))
cs