



나의 풀이
class Solution {
public String solution(int[] numbers, String hand) {
String answer = "";
int currL = 10; // 1
int currR = 12;
for (int i = 0; i < numbers.length; i++) {
int n = numbers[i];
if (n == 1 || n == 4 || n == 7) { // 2
currL = n;
answer += "L";
} else if (n == 3 || n == 6 || n == 9) { // 3
currR = n;
answer+= "R";
} else { // 4
if (n == 0) n = 11;
int disL = (Math.abs(n - currL) / 3) + (Math.abs(n - currL) % 3);
int disR = (Math.abs(n - currR) / 3) + (Math.abs(n - currR) % 3);
if (disR < disL) { // 5
currR = n;
answer += "R";
} else if (disL < disR) {
currL = n;
answer += "L";
} else {
if (hand.equals("right")) { // 6
currR = n;
answer += "R";
} else {
currL = n;
answer += "L";
}
}
}
}
return answer;
}
}
과정
- 키패드의 순서대로 번호를 붙인다(* = 10, 0 = 11, # = 12)
- numbers[i]가 1, 4, 7 중에 하나라면 왼손을 numbers[i]로 옮기고, answer에 L을 추가
- numbers[i]가 3, 6, 9중에 하나라면 오른손을 numbers[i]로 옮기고, answer에 R을 추가
- numbers[i]가 2, 5, 8, 0 중에 하나라면 왼손과 오른손의 목표지점까지의 거리를 잰다
- 거리가 더 가까운 쪽을 numbers[i]로 옮기고 해당하는 손을 answer에 추가
- 같다면 hand가 right면 R을 추가, left면 L을 추가
다른 사람 풀이
class Solution {
// 0부터 9까지 좌표 {y,x}
int[][] numpadPos = {
{3,1}, //0
{0,0}, //1
{0,1}, //2
{0,2}, //3
{1,0}, //4
{1,1}, //5
{1,2}, //6
{2,0}, //7
{2,1}, //8
{2,2} //9
};
//초기 위치
int[] leftPos = {3,0};
int[] rightPos = {3,2};
String hand;
public String solution(int[] numbers, String hand) {
this.hand = (hand.equals("right")) ? "R" : "L";
String answer = "";
for (int num : numbers) {
String Umji = pushNumber(num);
answer += Umji;
if(Umji.equals("L")) {leftPos = numpadPos[num]; continue;}
if(Umji.equals("R")) {rightPos = numpadPos[num]; continue;}
}
return answer;
}
//num버튼을 누를 때 어디 손을 사용하는가
private String pushNumber(int num) {
if(num==1 || num==4 || num==7) return "L";
if(num==3 || num==6 || num==9) return "R";
// 2,5,8,0 일때 어디 손가락이 가까운가
if(getDist(leftPos, num) > getDist(rightPos, num)) return "R";
if(getDist(leftPos, num) < getDist(rightPos, num)) return "L";
//같으면 손잡이
return this.hand;
}
//해당 위치와 번호 위치의 거리
private int getDist(int[] pos, int num) {
return Math.abs(pos[0]-numpadPos[num][0]) + Math.abs(pos[1]-numpadPos[num][1]);
}
}
- 키패드의 순서가 변하지 않으므로 고정시킨후 좌표로 찾는 방법도 나쁘지 않은 것 같다