본문 바로가기

코드 이야기

[LeetCode] Letter Combinations of a Phone Number - medium level

Problem

Given a string containing digits from 2-9 inclusive, return all possible letter combinations that the number could represent.
A mapping of digit to letters (just like on the telephone buttons) is given below. Note that 1 does not map to any letters.

Example 

   Input: "23"
   Output:
["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

Solution

 medium level의 문제의 난이도가 생각보다 변동폭이 큰 것 같다. 이 문제도 easy에 가까운 난이도의 문제라 상대적으로 쉽게 풀 수 있다.

일단 입력 숫자의 길이를 모르기 때문에 숫자를 문자로 변환하면 이전 결과에 계속 붙여가는 형태로 만들어야 한다. 이를 위해서 recursive 함수 호출로 할 수도 있지만, for 문을 이용해서 결과를 계속 업데이트 하는 형태로 풀었다.

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        digit2letter = {'2':'abc', '3':'def', '4':'ghi', '5':'jkl', '6':'mno', '7':'pqrs', '8':'tuv', '9':'wxyz'}
        
        ret = []
        for i, d in enumerate(digits):
            # 숫자를 문자로 변환
            letter = digit2letter[d]
            
            # 결과값이 최종 문자열만을 가지고 있어야 하기 때문에
            # 현재 상태의 문자열을 저장한 후에 최종 결과 리스트로 바꿔 준다.
            temp = []
            for ch in letter:
            	# 가장 최조의 문자열은 이전 결과값이 없기 때문에 그대로 리스트에 넣어준다.
                if len(ret) == 0:
                    temp.append(ch)
                else:
                	# 이전 문자열에 현재의 문자를 concatenate하는 형태로 만든 후에 리스트에 저장
                    for combination in ret:
                        temp.append(combination+ch)
            # 현재 만들어진 문자열 리스트를 결과값으로 업데이트 한다.
            ret = temp
        
        return ret