[LeetCode] 17. Letter Combinations of a Phone Number

yunanΒ·2021λ…„ 2μ›” 3일
0
post-thumbnail

πŸ”¦ 문제 링크

πŸ”Š 파이썬 μ•Œκ³ λ¦¬μ¦˜ 인터뷰 책을 μ°Έκ³ ν–ˆμŠ΅λ‹ˆλ‹€.

  • 문제

2-9κΉŒμ§€μ˜ 숫자λ₯Ό ν¬ν•¨ν•˜λŠ” λ¬Έμžμ—΄μ΄ 주어지면 μˆ«μžκ°€ λ‚˜νƒ€λ‚Ό μˆ˜μžˆλŠ” κ°€λŠ₯ν•œ λͺ¨λ“  문자 쑰합을 λ°˜ν™˜ν•©λ‹ˆλ‹€. μž„μ˜μ˜ μˆœμ„œλ‘œ 닡변을 λ°˜ν™˜ν•˜μ‹­μ‹œμ˜€.

✍️ 풀이


ν•΄λ‹Ή λ¬Έμ œλŠ” μˆ«μžμ— ν• λ‹Ήλœ λ¬Έμžλ“€μ„ μ–΄λ–»κ²Œ ν‘œν˜„ν•  것인지λ₯Ό 생각해내야 ν•œλ‹€. λ‹Ήμ—°νžˆ λ”•μ…”λ„ˆλ¦¬λ₯Ό 톡해 μ €μž₯해두면 λœλ‹€.

κ·Έ ν›„ λͺ¨λ“  문자 쑰합을 κ΅¬ν•΄μ•Όν•˜λ―€λ‘œ dfsλ₯Ό μ‚¬μš©ν•œλ‹€.

dfs에선 λ„˜μ–΄μ˜¨ index λΆ€ν„° λˆ„λ₯Ό 수 μžˆλŠ” λ²”μœ„κΉŒμ§€ 숫자의 λ¬Έμžλ“€μ„ 선택할 수 μžˆλ‹€.
문자 ν•˜λ‚˜λ₯Ό μ„ νƒν•˜λ©΄ λ‹€μŒ 문자λ₯Ό μ„ νƒν•˜κΈ° μœ„ν•΄ dfs둜 또 μ§„μž…ν•˜λ©° λ‹€μ‹œ 문자λ₯Ό μ„ νƒν•˜κ²Œ λœλ‹€.

이 λ•Œ μ€‘λ³΅λœ 문자λ₯Ό μ„ νƒν•˜μ§€ μ•Šλ„λ‘ λ„˜μ–΄μ˜¨ 인덱슀 이후 λΆ€ν„° 문자λ₯Ό μ„ νƒν•˜λ„λ‘ ν•œλ‹€.
κ²°κ³Ό 값은 μ„ νƒν•œ 문자의 길이가 주어진 숫자의 길이가 같을 λ•Œ λ°˜ν™˜ 값에 μΆ”κ°€ν•œλ‹€.

πŸ›  μ½”λ“œ


class Solution:
    # μ’€ 더 κΉ”λ”ν•˜κ²Œ 지 수 μžˆμ§€λ§Œ μ†λ„λŠ” λΉ„μŠ·ν•˜λ‹€.
    def letterCombinations(self, digits: str) -> List[str]:
        def dfs(index, path):
            if len(path) == len(digits):
                result.append(path)
                return
            
            for i in range(index, len(digits)):
                for j in dic[digits[i]]:
                    dfs(i + 1, path + j) # iλŠ” 쑰합을 μœ„ν•΄ λ¬Έμžκ°€ μ€‘λ³΅λ˜μ§€ μ•Šκ²Œ 선택할 수 있게 ν•΄μ€Œ.
                    # path + j둜 λ„˜κ²ΌκΈ°μ— popμ΄λ‚˜ join을 해쀄 ν•„μš”κ°€ μ—†λ‹€λŠ” μž₯μ μ΄μžˆλ‹€.
        if not digits:
            return []
        
        dic = {
            "2": "abc",
            "3": "def",
            "4": "ghi",
            "5": "jkl",
            "6": "mno",
            "7": "pqrs",
            "8": "tuv",
            "9": "wxyz",
        }
        
        result = []
        dfs(0, "")
        return result

πŸ“ 정리


🎈 참고


Book 링크

profile
Go Go

0개의 λŒ“κΈ€