본문 바로가기

코딩테스트

[프로그래머스] 키패드 누르기

function solution(numbers, hand) {
    let answer = '';
    let leftHand = 10;
    let rightHand = 12;
    let whatHand = hand == "left" ? 'L':'R';

    for (var i in numbers){
         if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7){
             leftHand = numbers[i];
             answer = answer + 'L'
         }else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9){
             rightHand = numbers[i];
             answer = answer + 'R'
         }else{
          //  각 키패드의 좌표를 객체로 만들기  
            const numXY = 
             {1:[1,1],2:[2,1],3:[3,1],4:[1,2],5:[2,2],6:[3,2],7:[1,3],8:[2,3],9:[3,3],10:[1,4],0:[2,4],12:[3,4]};
            // 두 키패드 사이의 거리 = 절댓값(이동하려는 위치(x,y) - 현재 왼손위치(x,y)) 
            let leftDistance = Math.abs(numXY[numbers[i]][0]-numXY[leftHand][0]) + Math.abs(numXY[numbers[i]][1]-numXY[leftHand][1])
            // 두 키패드 사이의 거리 = 절댓값(이동하려는 위치(x,y) - 현재 오른손위치(x,y)) 
            let RightDistance = Math.abs(numXY[numbers[i]][0]-numXY[rightHand][0]) + Math.abs(numXY[numbers[i]][1]-numXY[rightHand][1])

            // 오른쪽이 짧을 경우 
            if(leftDistance>RightDistance){
              rightHand = numbers[i];
             answer = answer + 'R'
            //  왼쪽이 짧을 경우 
            }else if(leftDistance<RightDistance){
              leftHand = numbers[i];
             answer = answer + 'L'
            //  양쪽 거리가 같을 경우 
            }else{
              answer = answer + whatHand;
              whatHand == 'R' ? rightHand = numbers[i] : leftHand = numbers[i];
            }
         }
    }

    return answer;
}

내가 문제를 풀었던 프로세스 : 

 

1_) 1,4,7이 나오는 경우에는 왼손, 3,6,9가 나오는 경우에는 오른손으로 클릭하게 만들기:

->leftHand = numbers[i];
             answer = answer + 'L'

->rightHand = numbers[i];
             answer = answer + 'R'

 

2_)  2,5,8,0이 나오는 경우에는 현재 위치에서 옮겨야 할 버튼의 위치의 절댓값을 구하기:

1)키패드의 번호들에 각각의 x,y좌표를 부여하기 

->const numXY = 
             {1:[1,1],2:[2,1],3:[3,1],

             4:[1,2],5:[2,2],6:[3,2],

             7:[1,3],8:[2,3],9:[3,3],

            10:[1,4],0:[2,4],12:[3,4]};

2)현재 위치에서 움직이려는 위치 사이에서의 거리 구하기 

-> // 두 키패드 사이의 거리 = 절댓값(이동하려는 위치(x,y) - 현재 왼손위치(x,y)) 
            let leftDistance = Math.abs(numXY[numbers[i]][0]-numXY[leftHand][0]) + Math.abs(numXY[numbers[i]][1]-numXY[leftHand][1])
            // 두 키패드 사이의 거리 = 절댓값(이동하려는 위치(x,y) - 현재 오른손위치(x,y)) 
            let RightDistance = Math.abs(numXY[numbers[i]][0]-numXY[rightHand][0]) + Math.abs(numXY[numbers[i]][1]-numXY[rightHand][1])

 

3)각각의 거리 값을 비교하기 (왼쪽이 더 클 때, 오른쪽이 더 클 때, 둘 다 같을 때)

->        // 오른쪽이 짧을 경우 
            if(leftDistance>RightDistance){
              rightHand = numbers[i];
             answer = answer + 'R'


            //  왼쪽이 짧을 경우 
            }else if(leftDistance<RightDistance){
              leftHand = numbers[i];
             answer = answer + 'L'


            //  양쪽 거리가 같을 경우 
            }else{
              answer = answer + whatHand;
              whatHand == 'R' ? rightHand = numbers[i] : leftHand = numbers[i];
            }

 


키패드를 x,y좌표로 구할 생각을 해내서, 스스로 뿌듯했던 문제. 다른 사람들의 풀이를 보고 나만 생각한건 아니었구나 깨달았던 문제.