CodeWars 예순 두 번째 문제

Updated:

Multi-tap Keypad Text Entry on an Old Mobile Phone

final static String one = "1ADGJMPTW* #";
final static String two = "BEHKNQUX0";
final static String three = "CFILORVY";
final static String four = "23456S8Z";
final static String five = "79";
	
public static int presses(String phrase) {
    int times = 0;

    phrase = phrase.toUpperCase();

    while(phrase.length() > 0) {

        String button = phrase.substring(0,1);

        if(one.contains(button)) {
            times++;
        } else if(two.contains(button)) {
            times+=2;
        } else if(three.contains(button)) {
            times+=3;
        } else if(four.contains(button)) {
            times+=4;
        } else if(five.contains(button)){
            times+=5;
        } else {
            times+=0;
        }

        phrase = phrase.substring(1);
    }

    return times;
}
  • 문제에서 가급적 하드 코딩을 하지 말라고 해서 나는 무엇인가 수식적 규칙이 있는 줄 알았다.
  • 그런데 모든 Best 코드 다 하드 코딩을 사용하긴 했다.
  • 크게 보면 알고리즘은 차이가 없으나 아래 Best 코드의 경우 문제에서 주어진 버튼 배열의 형식을 그대로 사용한 모습이다.
  • 나의 코드 경우 !나 입력 판에 다른 문자들이 오면 처리하기 애매해서 time+=0을 넣었다. 이건 의미가 없는 코드이기 때문에 위에 else if 구문을 여러 개의 if문으로 변경하려고 했으나 이 경우는 비효율적이다.
public class Keypad {
  	static String[] keys = {"1", "ABC2", "DEF3", "GHI4", "JKL5", "MNO6", "PQRS7", "TUV8", "WXYZ9", "*", " 0", "#"};
  
    public static int presses(String phrase) {
        int nPresses = 0;

        for (char c : phrase.toUpperCase().toCharArray())
            for (String s : keys)
                nPresses += s.indexOf(c) + 1;
        return nPresses;
    }
}
  • 그래서 Best 코드처럼 구성하는게 가장 좋은 것 같다.
  • 그래서 나의 코드를 효율적 & 보기 좋게 변경했다.
public static int presses(String phrase) {
    String[] keypad = {"1ADGJMPTW* #", "BEHKNQUX0", "CFILORVY", "23456S8Z", "79"};

    int times = 0;

    phrase = phrase.toUpperCase();

    while(phrase.length() > 0) {

        String button = phrase.substring(0,1);

        for(int i = 0 ; i < keypad.length; i++) {
            if(keypad[i].contains(button)) {
                times += i+1;
            }
        }

        phrase = phrase.substring(1);
    }

    return times;
}