https://school.programmers.co.kr/learn/courses/30/lessons/67256
키보드의 자판 위치는 고정값이기 때문에 미리 위치를 기억해 두고, 위치를 해시 처럼 꺼내쓰는 방식을 생각함.
위 로직을 구현할 방법으로 배열을 사용함
import java.util.Stack;
class Solution {
public String solution(int[] numbers, String hand) {
StringBuilder answer = new StringBuilder();
int[][] keyboard = {{0,3,1},{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,2}};
int left_hand = 10; // *
int right_hand = 11; // #
for(int i=0;i<numbers.length;i++){
int n = numbers[i];
if(n == 1||n == 4||n == 7) {
answer.append("L");
left_hand = n;
}
else if(n == 3||n == 6||n == 9) {
answer.append("R");
right_hand = n;
}
else{
int nX = keyboard[n][1];
int nY = keyboard[n][2];
int rX = keyboard[right_hand][1];
int rY = keyboard[right_hand][2];
int lX = keyboard[left_hand][1];
int lY = keyboard[left_hand][2];
double rDistance = Math.ceil(Math.sqrt((nX-rX)*(nX-rX) + (nY-rY)*(nY-rY)));
double lDistance = Math.ceil(Math.sqrt((nX-lX)*(nX-lX) + (nY-lY)*(nY-lY)));
if(rDistance > lDistance){
answer.append("L");
left_hand = n;
}else if(rDistance < lDistance){
answer.append("R");
right_hand = n;
}else{
String h = hand.equals("left") ? "L":"R";
if(h.equals("L")) left_hand = n;
else right_hand = n;
answer.append(h);
}
}
}
return answer.toString();
}
}
두 점 사이의 거리 공식을 이용해서 풀었던 문제이다. 다른사람들의 풀이를 봤을 땐 위치를 미리 선언하고, 위치 간 절대값을 이용해서 거리를 측정하는데 절대값으로 거리를 측정하는게 더 직관적으로 보였다.