2024년 4월 8일 월요일

leetcode.com 17. Letter Combinations of a Phone Number

문제 링크: https://leetcode.com/problems/letter-combinations-of-a-phone-number/description/

파이썬 소스: https://bit.ly/4cPkcyq

 

 전화기의 각 숫자에서는 3~4개의 알파벳이 맵핑되어 있습니다. 2개 숫자가 digits에 저장되어 있으면, 첫번째 숫자에 맵핑된 알파벳과, 두번째 숫자에 맵핑된 알파벳을 사용해서 길이가 2인 조합을 구하는 문제입니다.

다만 이 조합을 구할 때는 첫번째 글자는 첫번째 숫자에 맵핑된 알파벳에서 가지고 오고, 두번째 글자는 두번째 숫자에 맵핑된 알파벳에서 가지고 와야 합니다.

만약 변수 digits에 길이가 3 이상이라면, 첫번째, 두번째 숫자로 구한 조합에, 세번째 숫자에 맵핑된 알파벳을 사용해서, 길이가 3인 조합을 구합니다.

이 문제에서 예외로 처리해야 하는 부분은, 변수 digits의 길이가 0인 경우는 예외로 아래와 같이 빈 리스트 []를 리턴합니다.

if len(digits) == 0:
   
return []

 

문제를 푸는 코드를 작성하기에 앞서서, dt 딕셔너리 변수에, 각 숫자에 해당하는 알파벳의 리스트를 만들어 줍니다.

dt = {}
dt[
2] = ['a', 'b', 'c']
dt[
3] = ['d', 'e', 'f']
dt[
4] = ['g', 'h', 'i']
dt[
5] = ['j', 'k', 'l']
dt[
6] = ['m', 'n', 'o']
dt[
7] = ['p', 'q', 'r', 's']
dt[
8] = ['t', 'u', 'v']
dt[
9] = ['w', 'x', 'y', 'z']

 

 여기서 부터는 변수 digits의 길이가 1 이상이라고 가정할 수 있습니다. 앞에서 길이가 0인 경우는 예외로 처리하여, 리턴했기 때문입니다.

 

제일 앞에 있는 문자를 하나 받아와서, 숫자로 변환해서, output에 해당 숫자의 알파벳을 저장합니다.

output = dt[int(digits[:1])]

 

이제 두번째 문자부터 하나씩 처리해 보겠습니다. 만약에 두번째 문자가 없다면, for 루프는 실행되지 않고, output이 그대로 리턴됩니다.

for c in digits[1:]:
    idx =
int(c)
    output2 = []

   
for pre in output:
       
for post in dt[idx]:
            output2.append(pre + post)

    output = output2

 

 

문자를 숫자로 변환해서, idx에 저장합니다. 임시로 저장할 변수 output2 리스트를 선언합니다. 리스트 output에 있는 1개 를 꺼내서, dt[idx]가 가리키는 알파벳과 하나씩 더해줍니다. 더한 결과는 output2에 넣습니다.

 안쪽의 for 루프가 끝나면, output output2를 저장해서, 다음번 for 루프에서 output값이 사용될 수 있게 해줍니다. 이렇게 루프를 모두 돌고 나서, output을 리턴해주면 변수 digits에 해당하는 알파벳 조합을 구할 수 있습니다.

 

코데풀 유튜브 구독 부탁드립니다.

https://www.youtube.com/@codapul

 

from typing import List

class Solution:
   
def letterCombinations(self, digits: str) -> List[str]:
       
if len(digits) == 0:
           
return []

        dt = {}
        dt[
2] = ['a', 'b', 'c']
        dt[
3] = ['d', 'e', 'f']
        dt[
4] = ['g', 'h', 'i']
        dt[
5] = ['j', 'k', 'l']
        dt[
6] = ['m', 'n', 'o']
        dt[
7] = ['p', 'q', 'r', 's']
        dt[
8] = ['t', 'u', 'v']
        dt[
9] = ['w', 'x', 'y', 'z']

        output = dt[
int(digits[:1])]

       
for c in digits[1:]:
            idx =
int(c)
            output2 = []

           
for pre in output:
               
for post in dt[idx]:
                    output2.append(pre + post)

            output = output2

       
return output

 

댓글 없음:

댓글 쓰기