입력값으로 번호를 받으면, 그로 인해 만들어질 수 있는 알파벳의 조합을 모두 출력하는 문제이다.
모든 경우의 수를 만들어야 하므로, 백트래킹 알고리즘이라는 것을 알 수 있다.
알파벳을 모두 배열에 넣기 귀찮아서, 아스키코드값과 번호와의 방정식을 세워서 하기로 결심했다.
-> 7,9번이 알파벳이 4개인 것을 간과해서 이 방법은 결국 난잡하게 되었다.
문제 해결 방식
-
숫자를 앞부분부터 탐색
- 숫자에 알맞는 알파벳을 임시문자열 공간에 더하고 다음 숫자로 넘어가는 재귀함수를 호출
- 만약, 숫자를 모두 탐색했다면, 임시문자열의 문자열을 해답 배열에 넣는다.
문제에서 얻어갈 점
- DFS와 백트래킹의 차이점, 그리고 이 문제가 단순 재귀문제가 아니고 백트래킹이라는 것. (알파벳을 추가하여 재귀함수를 호출하고 문자를 지우고 다시 되돌아가서 다른 문자를 채운 재귀함수를 호출하기 때문)
- Dictionary를 활용한 코드에 대해서도 생각해볼 것
- 함수의 self에 대해 다시 잘 공부해보기 -> recur(self,i,st)가 아닌 recur(i,st)라는 점
3) self 이해하기 - 파이썬으로 배우는 알고리즘 트레이딩 (개정판-2쇄) (wikidocs.net)
위키독스
온라인 책을 제작 공유하는 플랫폼 서비스
wikidocs.net
나의 코드
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
answer = []
if len(digits) == 0:
return answer
def recur(i,st):
if i == len(digits):
answer.append(st)
else:
k = int(digits[i])
if k <= 6:
recur(i+1, st + chr(3*k+91))
recur(i+1, st + chr(3*k+92))
recur(i+1, st + chr(3*k+93))
elif k == 7:
recur(i+1, st + chr(112))
recur(i+1, st + chr(113))
recur(i+1, st + chr(114))
recur(i+1, st + chr(115))
elif k == 8:
recur(i+1, st + chr(116))
recur(i+1, st + chr(117))
recur(i+1, st + chr(118))
elif k == 9:
recur(i+1, st + chr(119))
recur(i+1, st + chr(120))
recur(i+1, st + chr(121))
recur(i+1, st + chr(122))
recur(0,"")
return answer
Leetcode 솔루션에 있는 Dictionary를 활용한 코드
class Solution:
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
phone = {'2': ['a', 'b', 'c'],
'3': ['d', 'e', 'f'],
'4': ['g', 'h', 'i'],
'5': ['j', 'k', 'l'],
'6': ['m', 'n', 'o'],
'7': ['p', 'q', 'r', 's'],
'8': ['t', 'u', 'v'],
'9': ['w', 'x', 'y', 'z']}
def backtrack(combination, next_digits):
# if there is no more digits to check
if len(next_digits) == 0:
# the combination is done
output.append(combination)
# if there are still digits to check
else:
# iterate over all letters which map
# the next available digit
for letter in phone[next_digits[0]]: #숫자를 key로 활용
# append the current letter to the combination
# and proceed to the next digits
backtrack(combination + letter, next_digits[1:])
output = []
if digits:
backtrack("", digits)
return output
'Leetcode Top 100' 카테고리의 다른 글
20. Valid Parentheses (0) | 2021.01.18 |
---|---|
19. Remove Nth Node From End of List (0) | 2021.01.12 |
15. 3Sum (0) | 2021.01.10 |
11. Container With Most Water (O(n)솔루션 존재) (0) | 2021.01.08 |
10. Regular Expression Matching (해결 x 솔루션 o) (0) | 2021.01.07 |