문제
100/100
1시간10분 소요
키패드의 왼쪽라인은 왼쪽손으로 오른쪽라인은 오른손으로
중간은 해당 거리를 계산하여 가까운쪽으로 하되 둘다 같으면 hand배열을 통해 적용시킨다.
function solution(numbers, hand) {
let phone = [[1,2,3],[4,5,6],[7,8,9],['*',0,'#']];
let rRight = 3 , cRight = 2 , rLeft = 3, cLeft= 0;
let result = numbers.map(val=>{
if(val%3 == 2 || val==0){
let re;
phone.map((arr,i)=>{
arr.map((x,j)=>{
if(val == x){
let dif = (Math.abs((rRight-i)) + Math.abs((cRight-j))) - (Math.abs((rLeft-i)) + Math.abs((cLeft-j)))
console.log(dif)
if(dif > 0){ //L
rLeft = i;
cLeft = j;
re = 'L';
}
else if(dif < 0){ //R
rRight = i;
cRight = j;
re = 'R';
}
else{ //
if(hand[0] == 'r'){
rRight = i;
cRight = j;
}
else{
rLeft = i;
cLeft = j;
}
re = hand[0].toUpperCase();
}
}
})
})
return re;
}
else if(val%3 == 1){
phone.map((arr,i)=>{
arr.map((x,j)=>{
if(val == x){
rLeft = i;
cLeft = j;
}
})
})
return 'L';
}
else if(val%3 == 0){
phone.map((arr,i)=>{
arr.map((x,j)=>{
if(val == x){
rRight = i;
cRight = j;
}
})
})
return 'R';
}
})
return result.join('')
}
- 중간일때
1) 차이가 양수일때
2) 차이가 음수일때
3) 차이가 0일때 => hand[0]이 'r'일때와 hand[0]이 'l'일때- 왼쪽일때
- 오른쪽일때
phone.map((arr,i)=>{
arr.map((x,j)=>{
if(val == x){
...
}
})
})
위와 같은 구조를 자주 쓰는데 해당하는 i,j에서의 원하는 값 val이 해당 x와 같으면 그때의 i,j를 적용시킨다.
function returnLeft(i,j){
return [i,j,'L']
}
function returnRight(i,j){
return [i,j,'R']
}
function solution(numbers, hand) {
let phone = [[1,2,3],[4,5,6],[7,8,9],['*',0,'#']];
let rRight = 3 , cRight = 2 , rLeft = 3, cLeft= 0;
let result = numbers.map(val=>{
let num;
if(val%3 == 2 || val==0) //중간 위치 번호라면
{
phone.map((arr,i)=>{
arr.map((x,j)=>{
if(val == x){
let dif = (Math.abs((rRight-i)) + Math.abs((cRight-j))) - (Math.abs((rLeft-i)) + Math.abs((cLeft-j)))
if(dif > 0)[rLeft,cLeft,num] = returnLeft(i,j)
else if(dif < 0)[rRight,cRight,num] = returnRight(i,j)
else{
if(hand[0] == 'l')[rLeft,cLeft,num] = returnLeft(i,j)
else[rRight,cRight,num] = returnRight(i,j)
}
}
})
})
return num;
}
else if(val%3 == 1){
phone.map((arr,i)=>{
arr.map((x,j)=>{
if(val == x)[rLeft,cLeft,num] = returnLeft(i,j)
})
})
return num;
}
else if(val%3 == 0){
phone.map((arr,i)=>{
arr.map((x,j)=>{
if(val == x)[rRight,cRight,num] = returnRight(i,j)
})
})
return num;
}
})
return result.join('')
}
반복되는 부분을 returnLeft와 returnRight 함수로 만들었다.