const keypads=[[1,2,3],[4,5,6],[7,8,9],['*',0,'#']]
키패드의 배열을 정의했따.
그리고 왼손, 오른손의 위치를 기록하기위해 변수생성
let left=[3,0]
let right=[3,2]
그리고문제에서는 내가 눌러야하는 numbers의 배열이 제공되는데,
예를들어
[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5]
라면
키패드의 배열안에서 각 숫자의 위치를 알아야한다.
그래서 findkey라는 함수를 생성
function findkey(target){
const keypads=[[1,2,3],[4,5,6],[7,8,9],['*',0,'#']]
for(let i=0;i<4;i++){
for(let j=0;j<3;j++){
if(keypads[i][j]==target){
return [i,j]
}
}
}
}
만약 왼손 위치가 [1,0]
:4
오른손 위치가 [0,2]
: 3
findkey로 알아낸 눌러야할 number(target)의 위치가 [1,1]
: 5
이라면
왼손이 현재 4에 있으므로, 1칸만 이동
오른손은 3에 위치 -> 2칸 이동
이를 어떻게 구하냐면,
let totalL= Math.abs(target[0]-left[0])+Math.abs(target[1]-left[1])
let totalR= Math.abs(target[0]-right[0])+Math.abs(target[1]-right[1])
전체적인 핵심 풀이는 이러하다.
function findkey(target){
const keypads=[[1,2,3],[4,5,6],[7,8,9],['*',0,'#']]
for(let i=0;i<4;i++){
for(let j=0;j<3;j++){
if(keypads[i][j]==target){
return [i,j]
}
}
}
}
function solution(numbers, hand) {
var answer = '';
let left=[3,0]
let right=[3,2]
for(let i=0;i<numbers.length;i++){
let target= findkey(numbers[i])//target =[0,0]
if(target[1]==0){
answer=answer+'L'
left=target
}else if(target[1]==2){
answer=answer+'R'
right=target
}else if(target[1]==1){
let totalL= Math.abs(target[0]-left[0])+Math.abs(target[1]-left[1])
let totalR= Math.abs(target[0]-right[0])+Math.abs(target[1]-right[1])
if(totalL==totalR){
if(hand==='right'){
answer=answer+'R'
right=target
}else{
answer=answer+'L'
left=target
}
}else if(totalL>totalR){//R을누름
answer=answer+'R'
right=target
}else if(totalL<totalR){
answer=answer+'L'
left=target
}
}
}
return answer;
}