import java.util.*;
class Solution {
public String solution(int[] numbers, String hand) {
String answer = "";
// 왼쪽 엄지손가락, 오른쪽 엄지손가락 위치 초기화
Pos lp = new Pos(4,1);
Pos rp = new Pos(4,3);
// 각 번호의 위치 초기화
Map<Integer, Pos> map = new HashMap<>();
map.put(1, new Pos(1,1));
map.put(2, new Pos(1,2));
map.put(3, new Pos(1,3));
map.put(4, new Pos(2,1));
map.put(5, new Pos(2,2));
map.put(6, new Pos(2,3));
map.put(7, new Pos(3,1));
map.put(8, new Pos(3,2));
map.put(9, new Pos(3,3));
map.put(0, new Pos(4,2));
// 번호 누르기 시작
for(int i = 0; i < numbers.length; i++){
// 번호가 1,4,7일때는 왼손으로 누르기
if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7){
answer += "L";
lp = map.get(numbers[i]);
// 번호가 3,6,9일때는 오른손으로 누르기
}else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9){
answer += "R";
rp = map.get(numbers[i]);
// 번호가 2,5,8,0일때
}else{
// 현재 번호의 위치 가져오기
Pos now = map.get(numbers[i]);
// 왼손의 위치와 현재 위치의 거리값 계산
int tmpl = (Math.max(lp.x, now.x) - Math.min(lp.x, now.x)) +
(Math.max(lp.y, now.y) - Math.min(lp.y, now.y));
// 오른손의 위치와 현재 위치의 거리값 계산
int tmpr = (Math.max(rp.x, now.x) - Math.min(rp.x, now.x)) +
(Math.max(rp.y, now.y) - Math.min(rp.y, now.y));
// 왼손이 더 가까울 때
if(tmpl < tmpr){
answer += "L";
lp = now;
// 오른손이 더 가까울 때
}else if(tmpl > tmpr){
answer += "R";
rp = now;
// 거리가 같을 때
}else{
if(hand.equals("left")){
answer += "L";
lp = now;
}else{
answer += "R";
rp = now;
}
}
}
}
return answer;
}
}
// 번호의 위치를 저장하기 위한 클래스
class Pos{
int x;
int y;
public Pos(int x, int y){
this.x = x;
this.y = y;
}
}
처음에는 모든 경우의 수를 if문을 통해 구현하려고 하였다.
하지만 그럴 경우 고려해야할 경우의 수가 너무 많았다.
그래서 그 다음에는 단순히 왼손이 위치한 번호와 오른손이 위치한 번호, 현재 번호의 숫자를 계산을 통해 처리해보려고 생각했는데, 그것도 식이 떠오르질 않아 패스했다.
그래서 떠올린 방법은 일단 맵을 이용해 각 번호와 키패드의 좌표를 저장하고,
왼손이 위치한 번호의 좌표, 오른손의 좌표, 현재 번호의 좌표를 각각 계산해 거리가 가까운 손으로 누르는 방식으로 문제를 해결하였다.
위의 코드와 주석을 보는게 이해가 더 빠를 것 같다.
요새 뭔가 map을 자주 쓰게 되는거 같다.