[JAVA/LeetCode] Top 100 Liked Question: 17. Letter Combinations of a Phone Number

👀 문제

https://leetcode.com/problems/letter-combinations-of-a-phone-number/

👊 도전

1. 설계

  1. 숫자별 영어를 char[][]에 저장한다.
  2. input을 하나씩 확인하며 combination으로 모두 구한다.

2. 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/**
 *
 * @author HEESOO
 *
 */
class Solution {
    char[][] array;    
    List<String> list;
    
    public List<String> letterCombinations(String digits) {
        list=new ArrayList<>();
        if(digits.equals("")) return list;
        
        array=new char[8][];
        array[0]="abc".toCharArray();
        array[1]="def".toCharArray();
        array[2]="ghi".toCharArray();
        array[3]="jkl".toCharArray();
        array[4]="mno".toCharArray();
        array[5]="pqrs".toCharArray();
        array[6]="tuv".toCharArray();
        array[7]="wxyz".toCharArray();
        
        
        combination("", digits);
        return list;
    }
    
    public void combination(String str, String digits){
        if(digits.length()==0) { // 숫자 체크가 끝났다면
            list.add(str); // 지금까지 만든 str을 리스트에 저장
            return;
        }
        
        char digit=digits.charAt(0); // 현재 체크할 숫자 찾기
        int idx=digit-'2'; 
        for(char ch:array[idx]){ // 알파벳붙이고 다음으로 이동
            combination(str+ch, digits.substring(1));
        }
    }
}

3. 결과

실행결과 🤟 성공 🤟

4. 설명

  1. 숫자별 알파벳을 이차원 배열에 저장한다
    • 숫자는 2~9이므로 배열 첫 번째의 길이는 8이다.
    • 각 숫자별 알파벳 개수가 다르므로 toCharArray()로 각각 생성한다.
  2. 조합을 이용해 letter을 만든다
    • combination의 파라미터 str는 지금까지 생성된 output, digits는 체크해야 할 숫자들이다.
    • digits의 0번째 숫자에 해당하는 알파벳을 str에 붙인 후, 재귀를 이용해 다음으로 이동한다.
    • 이때 현재 숫자 체크가 끝났으므로 substring(1)으로 현재 숫자를 삭제한 후 넘긴다.
    • digits가 없으면 숫자를 모두 체크한 것이므로 지금까지 만들어진 str를 ArrayList에 저장한다.

👏 해결 완료!