[LeetCode] Letter combinations of a phone number

less than 1 minute read

문제정보

어떻게 풀까?

모든 가능한 경우의 조합을 표시하는 것이다.

재귀적으로 호출하여 푸는 방법과, Queue를 두어 반복적으로 풀어내는 방법이 있다. 재귀적인 방법이 좀 더 직관적이고 쉬워보인다.

문제풀이(Java) - 재귀적인 방법

class Solution {
  private static final String[] mapping = new String[]{"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};

    public List<String> letterCombinations(String digits) {
      List<String> ret = new ArrayList<>();
      if(digits.length() == 0) return ret;
      combination("", digits, 0, ret);
      return ret;
    }

    public void combination(String prefix, String digits, int offset, List<String> ret){
      if(offset >= digits.length()){
        ret.add(prefix);
        return;
      }
      String letters = mapping[digits.charAt(offset) - '0'];
      for(int i=0; i<letters.length(); i++){
        combination(prefix+letters.charAt(i), digits, offset+1, ret);
      }
    }
}

문제풀이(Java) - 반복적인 방법

반복적인 방법은 조금 어렵다. 반복할 대상을 Queue(LinkedList)에 넣어 빼가며 결과를 만든다.

조합이 된 각 문자는 digits의 length만큼의 길이가 되야하기 때문에, 이 경우가 될 때까지 Queue에 뺐다 넣었다를 반복하며 조합을 진행한다.

public List<String> letterCombinations(String digits) {
  LinkedList<String> ret = new LinkedList<String>();
  if(digits.isEmpty()) return ret;
  String[] mapping = new String[]{"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
  ret.add("");
  while(ret.peek().length()!=digits.length()){
    String remove = ret.remove();
    String map = mapping[digits.charAt(remove.length())-'0'];
    for(char c: map.toCharArray()){
      ret.addLast(remove+c);
    }
  }
  return ret;
}

Leave a comment