리트코드 LeetCode 17 Letter Combinations of a Phone Number
문제의 파이썬 python 풀이입니다.
https://leetcode.com/problems/letter-combinations-of-a-phone-number/description/
문제
2에서 9까지 숫자가 주어졌을 때 전화 번호로 조합 가능한 모든 문자를 출력하라.
풀이
# 폰 번호 문자 조합 : 모든 조합 탐색 (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) #path에 digits[i]을 더해서 가져감
# 예외 처리
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
def dfs(index, path):
index
: 현재 몇 번째 숫자를 처리 중인지 나타냄path
: 지금까지 조합한 문자들을 저장하는 문자열
예를 들어,'2' → abc
,'3' → def
이면- 첫 번째 단계에서
'a'
를 선택 →path = 'a'
- 두 번째 단계에서
'd'
를 선택 →path = 'ad'
- 끝까지 조합이 완료되면 →
result.append('ad')
- 첫 번째 단계에서
즉, path
는 현재 만들고 있는 조합 중간 결과입니다.
예시
입력: digits = "23"
딕셔너리:
dic = {"2": "abc", "3": "def"}
DFS 흐름
dfs(0, ""):
├─ dfs(1, "a"):
│ ├─ dfs(2, "ad") → 끝 → 저장
│ ├─ dfs(2, "ae") → 끝 → 저장
│ └─ dfs(2, "af") → 끝 → 저장
├─ dfs(1, "b"):
│ ├─ dfs(2, "bd") → 끝 → 저장
│ ├─ dfs(2, "be") → 끝 → 저장
│ └─ dfs(2, "bf") → 끝 → 저장
├─ dfs(1, "c"):
├─ dfs(2, "cd") → 끝 → 저장
├─ dfs(2, "ce") → 끝 → 저장
└─ dfs(2, "cf") → 끝 → 저장
재귀 호출을 하면서 이 문자열을 점점 길게 만들어 가다가, digits
길이와 같아지면 결과에 저장합니다.
'Algorithm > Python' 카테고리의 다른 글
BOJ 23253 자료구조는 정말 최고야 (0) | 2025.04.17 |
---|---|
LeetCode 46 Permutations (0) | 2025.04.12 |
BOJ 16961 탭 vs 공백 (0) | 2025.04.05 |
BOJ 27162 Yacht Dice (0) | 2025.03.30 |
BOJ 25204 문자열 정렬 (0) | 2025.03.30 |