문제 설명
스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
구현코드:
class Solution {
public String solution(int[] numbers, String hand) {
StringBuffer as =new StringBuffer();
int left = 10;
int right = 12;
for(int number : numbers){
if(number == 1 || number == 4 || number == 7){
as.append("L");
left=number;
}else if(number == 3 || number == 6 || number == 9){
as.append("R");
right=number;
}else{
int leftLength = length(left,number);
int rightLength = length(right,number);
if(leftLength > rightLength) {
as.append("R");
right = number;
} else if(leftLength < rightLength) {
as.append("L");
left = number;
} else {
if(hand.equals("right")) {
as.append("R");
right = number;
} else {
as.append("L");
left = number;
}
}
}
}
String answer = as.toString();
return answer;
}
public int length(int index,int number){
index = (index == 0) ? 11 : index;
number = (number == 0) ? 11 : number;
int x = (index - 1) / 3;
int y = (index - 1) % 3;
int numberX = number / 3;
int numberY = 1;
return Math.abs(x-numberX) + Math.abs(y-numberY);
}
}
문제 해설:
lett 값은 무조건 왼손이 rigth 값은 무조건 오른손이 하게되고 center 값이 왼손이 할지 오른손이 할지를 구하는 문제이다.
문제를 풀기위해서는 키패드를 좌표라고 생각한 후 2,5,8,0에 대해 현재 위치해있는 왼손,오른손의좌표와의 거리의 차를 구해 더 가까이에있는 손이 키패드를 눌어야한다.
left | center | right | |
---|---|---|---|
row1 | 1 | 2 | 3 |
row2 | 4 | 5 | 6 |
row3 | 7 | 8 | 9 |
row4 | * | 0 | # |
우선 좌표로 바꿔본다면 이렇게 표현할 수있다.
left | center | right | |
---|---|---|---|
row1 | 1[0][0] | 2[0][1] | 3[0][2] |
row2 | 4[1][0] | 5[1][1] | 6[1][2] |
row3 | 7[2][0] | 8[2][1] | 9[2][2] |
row4 | *[3][0] | 0[3][1] | #[3][2] |
그러면 숫자,문자에 대해서 좌표로 나타내야하는데 어떻게 식으로 나타낼 수있을까?
x 좌표는 (숫자-1)/3
y좌표를 (숫자-1)%3 이라고 표현 할 수있다. 그러면 *,0,#은 어떡할 것인가? 답은 간단하다 10,11,12 라고 생각 하면 된다.