function solution(numbers, hand) {
let ans = "";
let right = '#';
let left = '*';
let keypad = [{num:'*', row:3, col:0}, {num:0, row:3, col:1}, {num:'#', row:3, col:2}];
for(let i=1; i<10; i++){
keypad.push({num:i, row:Math.floor((i-1)/3), col:(i-1)%3});
}
numbers.forEach(number => {
if(number%3 == 1){ // 1열(1, 4, 7)
ans += "L";
left = number;
}else if(number%3 == 2 || number == 0){ // 2열(2, 5, 8, 0)
let Lx = 0;
let Ly = 0;
let Rx = 0;
let Ry = 0;
// 누르고자 하는 곳의 좌표 저장
for(let i=0; i<keypad.length; i++){
if(keypad[i].num == number){
Lx = Rx = keypad[i].row;
Ly = Ry = keypad[i].col;
break;
}
}
// 현재 엄지손가락의 좌표와 거리 계산
for(let i=0; i<keypad.length; i++){
if(keypad[i].num == left){
Lx = Math.abs(Lx - keypad[i].row);
Ly = Math.abs(Ly - keypad[i].col);
break;
}
}
for(let i=0; i<keypad.length; i++){
if(keypad[i].num == right){
Rx = Math.abs(Rx - keypad[i].row);
Ry = Math.abs(Ry - keypad[i].col);
break;
}
}
// 움직일 손 결정
if(Lx+Ly < Rx+Ry){
ans += "L";
left = number;
}else if(Lx+Ly > Rx+Ry){
ans += "R";
right = number;
}else{
if(hand == "left"){
ans += "L";
left = number;
}else{
ans += "R";
right = number;
}
}
}else{ // 3열(3, 6, 9)
ans += "R";
right = number;
}
})
return ans;
}
꼼꼼히 손코딩하며 생각해본 후에 작성해 그나마 시간이 덜 걸린 것 같다. ans와 left를 저장하는 부분에서 반복되는 코드들이 조금씩 있어 신경 쓰이지만 함수로 빼려면 forEach 내부에서 인덱스를 다시 가져와야하기 때문에 그냥 두기로😔 이번주말 우테캠 코테에서도 이정도 스퍼트만 나와주길!