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;
}