class Solution { public String solution(int[] numbers, String hand) { String answer = ""; int curLeft = 10; // * -> 10 int curRight = 12; // # -> 12 for(int num : numbers){ // 1,4,7 왼손 // 3,6,9 오른손 switch(num){ case 1: answer +="L"; curLeft = 1; break; case 3: answer +="R"; curRight = 3; break; case 4: answer +="L"; curLeft = 4; break; case 6: answer +="R"; curRight = 6; break; case 7: answer +="L"; curLeft = 7; break; case 9: answer +="R"; curRight = 9; break; default: int leftLen = getLength(curLeft,num); int rightLen = getLength(curRight,num); if(leftLen > rightLen){ answer += "R"; curRight=num; }else if(leftLen < rightLen){ answer += "L"; curLeft = num; }else{ // 길이가 같으면 오른손 잡이면 오른손, 왼손잡이는 왼손 if(hand.equals("right")){ answer += "R"; curRight=num; }else{ answer +="L"; curLeft=num; } } break; } } return answer; } // 손의 위치와 누르고자하는 번호의 길이 구하는 함수 public static int getLength(int index, int num){ if(index==0){ // 키패드 0이면 11숫자로 치환 index=11; } if(num==0){ // 키패드 0이면 11숫자로 치환 num=11; } int indexX = (index-1)/3; int indexY = (index-1)%3; int numX = (num/3); int numY = 1; return Math.abs((indexX-numX)) + Math.abs((indexY-numY)); } }
키패드를 2차배열의 인덱스로 접근하였다.
1(0,0) 2(0,1) 3(0,2)
4(1,0) 5(1,1) 6(1,2)
7(2,0) 8(2,1) 9(2,2)
10(3,0) 11(3,1) 12(3,2)
이런식으로 인덱스로 접근한다(*은 10으로, 0은 11, #은 12)
1,4,7은 왼손으로 누르고, 3,6,9는 오른손으로 누른다.
고민해야하는 것은 2,5,8,0의 숫자들이다.
2,5,8,0을 눌러야 할 때 getLength() 함수를 통해 왼손과의 길이와 오른손과의 길이를 구해서 비교한다.public static int getLength(int index, int num){ if(index==0){ // 키패드 0이면 11숫자로 치환 index=11; } if(num==0){ // 키패드 0이면 11숫자로 치환 num=11; } int indexX = (index-1)/3; int indexY = (index-1)%3; int numX = (num/3); int numY = 1; return Math.abs((indexX-numX)) + Math.abs((indexY-numY)); }
- indexX : 왼손 또는 오른손의 X좌표
- indexY : 왼손 도는 오른손의 Y좌표
- numX : 누르고자하는 숫자의 X좌표
- numY : 누르고자하는 숫자의 Y좌표
return으로 x좌표끼리 차의 절댓값과 y좌표끼리 차의 절댓값을 더한것을 반환