[프로그래머스] [카카오 인턴] 키패드 누르기
// 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);
}