(진행중) [leetcode] 33 전화 번호 문자 조합

코딩코딩·2024년 7월 30일
0

번호마다 출력 가능한 문자열이 주어진다.
다수의 번호가 눌렸을 때, 화면에 표기될 수 있는 모든 경우의 문자열을 출력하는 문제이다. (물론, 하나의 번호가 눌리는 경우도 있다.)

24-07-30

class Solution(object):

    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """
        
        dict = {"2": "abc", "3":"def", "4":"ghi", "5":"jkl", "6":"mno","7":"pqrs","8":"tuv","9":"wxyz"}

        if len(digits) > 0:

            answer = [""]

            for i in range(len(digits)):
                answer_ = []
                press_number = dict[digits[i]] 
                for letter in press_number:
                    answer_ += [ans + letter for ans in answer]
                answer = answer_

            return answer

        else: #empty input

            return []

각 번호에 할당된 문자열을 리스트로 만들고,
새로운 번호가 눌렸을 때, 새로운 번호의 문자열 리스트와의 조합을 계산한다.

press 2 : ['a', 'b', 'c']
press 3 : ['ae', 'be', 'ce' ,....]

run time은 20ms로, 꽤 길다..

class Solution(object):

    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """
        
         if digits == "":
            return []
        
        dict = {"2": "abc", "3":"def", "4":"ghi", "5":"jkl", "6":"mno","7":"pqrs","8":"tuv","9":"wxyz"}

        answer = [""]

        for digit in digits:
            answer = [ans + letter for letter in dict[digit] for ans in answer]
            
        return answer

--> 간결한 코드 버전!
1. 예외 케이스를 앞으로 빼면서 코드 전체 indent를 복잡하지 않게 정리함
2. answer 제거. (20ms -> 17ms)
answer
를 도입한 이유는 for문 돌면서 answer가 바뀌지 않도록 하는 장치였으나, 두 개의 for문을 inline으로 작성하면서 문제가 해결됨!

To do list
DFS를 이용하자! 그래프 문제~~
모든 경우의 수를 DFS로 탐색하고 백트래킹으로 결과를 조합하면서 리턴하는 코드를 작성하세요.
(Hint: 결과를 조합할 때는 v의 길이가 digits의 길이와 같을 때 return 합니다.)

profile
심심해서 하는 코딩..

0개의 댓글