👀 문제
https://leetcode.com/problems/letter-combinations-of-a-phone-number/
👊 도전
1. 설계
- 숫자별 영어를 char[][]에 저장한다.
- 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. 설명
- 숫자별 알파벳을 이차원 배열에 저장한다
- 숫자는 2~9이므로 배열 첫 번째의 길이는 8이다.
- 각 숫자별 알파벳 개수가 다르므로 toCharArray()로 각각 생성한다.
- 조합을 이용해 letter을 만든다
- combination의 파라미터 str는 지금까지 생성된 output, digits는 체크해야 할 숫자들이다.
- digits의 0번째 숫자에 해당하는 알파벳을 str에 붙인 후, 재귀를 이용해 다음으로 이동한다.
- 이때 현재 숫자 체크가 끝났으므로 substring(1)으로 현재 숫자를 삭제한 후 넘긴다.
- digits가 없으면 숫자를 모두 체크한 것이므로 지금까지 만들어진 str를 ArrayList에 저장한다.