// https://school.programmers.co.kr/learn/courses/30/lessons/67256
function solution(numbers, hand) {
let answer = '';
let rightHandPosition = '#';
let leftHandPosition = '*';
for(let i = 0; i < numbers.length; i++) {
const checkHandle = checkPosition(numbers[i])
if(checkHandle){
// 키패드 위치가 왼쪽,오른쪽이면
answer += checkHandle
// 정답 스트링에 추가
// 마지막 위치 변수에 저장
if(checkHandle === 'L'){
leftHandPosition = numbers[i]
}
if(checkHandle === 'R'){
rightHandPosition = numbers[i]
}
} else {
// 키패드 위치가 중간이라면 마지막위치랑 비교해서..
const findResult = findCenterPosition(numbers[i],leftHandPosition,rightHandPosition,hand)
answer += findResult.hand
if(findResult.hand === 'R'){
rightHandPosition = findResult.lastPosition
}
if(findResult.hand === 'L'){
leftHandPosition = findResult.lastPosition
}
}
}
return answer;
}
// 왼쪽,오른쪽 , 중간 키패드 값 return
const checkPosition = (position) => {
switch(position){
case 1:
case 4:
case 7:
return 'L'
case 3:
case 6:
case 9:
return 'R'
default:
return false
}
}
// 중간일 경우 키패드간 거리 확인 함수
const findCenterPosition = (number,left,right,hand) => {
const keyPad = [[1,4,7,'*'],[2,5,8,0],[3,6,9,'#']]
let leftIndex = keyPad[0].findIndex(item => item === left)
let rightIndex = keyPad[2].findIndex(item => item === right)
let centerIndex = keyPad[1].findIndex(item => item === number)
let result
let leftPosition = 0
let rightPosition = 0;
// 손가락이 왼쪽,오른쪽에 있을경우 중간으로 이동해야해서 + 1
if(0 < leftIndex){
leftPosition = difference(centerIndex,leftIndex) + 1
} else {
// 중간에 있을경우 2 5 8 0 중에 있으므로 다시 인덱싱
leftPosition = difference(centerIndex, keyPad[1].findIndex(item => item === left))
}
if(0 < rightIndex){
rightPosition = difference(centerIndex,rightIndex) + 1
} else {
rightPosition = difference(centerIndex, keyPad[1].findIndex(item => item === right))
}
// 두개가 같으면 hand에 따라 return
if(leftPosition === rightPosition){
if(hand === 'right'){
result= {
hand: 'R',
lastPosition: number
}
} else {
result ={
hand: 'L',
lastPosition: number,
}
}
} else {
// 두개가 다르면 작은 값 return
if(leftPosition < rightPosition){
result = {
hand: 'L',
lastPosition: number
}
} else {
result = {
hand: 'R',
lastPosition: number
}
}
}
return result
}
// 절대값 반환 함수
function difference(a, b) {
return Math.abs(a - b);
}
Comment