본문 바로가기

주5일알고리즘

Programmers: 키패드 누르기 with JS

<내 풀이> 못풀었다.

function solution(numbers, hand) {
    var newNumbers = numbers.map(i => i === 0 ? 11 : i);
    var left = [1,4,7,10];
    var lefthand = 10;
    var right = [3,6,9,12];
    var righthand = 12;
    var middle = [2,5,8,11];
    var varHand = hand == 'right' ? 'R' : 'L';
    var L_D;
    var R_D;

    return newNumbers.map(item => {
        if(left.includes(item)){
            lefthand = item;
            return answer += 'L';
        }
        if(right.includes(item)){
            righthand = item;
            return answer += 'R';
        }
       if(middle.includes(item)){
           if(left.includes(lefthand)){
               L_D = Math.abs(lefthand+1-item)/3+1
           }
           if(middle.includes(lefthand)){
               L_D = Math.abs(lefthand-item)/3
           }
           if(right.includes(righthand)){
               R_D = Math.abs(righthand-1-item)/3+1
           }
           if(middle.includes(righthand)){
               R_D = Math.abs(righthand-item)/3
           }
           if(L_D>R_D){
               righthand = item;
               return answer += 'R'
           }
           if(L_D<R_D){
               lefthand = item;
               return answer += 'L'
           }
           if(L_D=R_D){
               if(varHand=='R'){
                  righthand = item;
                  return answer += 'R';
               }else{
                  lefthand = item;
                  return answer += 'L'; 
               }      
           }
       }       
   })
}


<다른 사람 풀이>

function solution(numbers, hand) {
    
    function dis(num, lH, rH, pos, hand){
    const lD = Math.abs(pos[lH][0] - pos[num][0]) + 
        Math.abs(pos[lH][1] - pos[num][1])
    const rD = Math.abs(pos[rH][0] - pos[num][0]) + 
        Math.abs(pos[rH][1] - pos[num][1])
    
    if (lD === rD) return hand === 'left' ?  'L' : 'R';
    return lD < rD ? 'L' : 'R'
}

    const pos = {
        1: [0, 0], 2: [0, 1], 3: [0, 2],
        4: [1, 0], 5: [1, 1], 6: [1, 2],
        7: [2, 0], 8: [2, 1], 9: [2, 2],
        '*': [3, 0], 0: [3, 1], '#': [3, 2]
    };
    var lH = '*', rH = '#';
    var result = ''
    for (var num of numbers){
        if (num % 3 === 1){
            result += 'L';
            lH = num;
        }
        
        else if (num !==0 && num % 3 === 0){
            result += 'R';
            rH = num;
        }
        else{
            result += dis(num, lH, rH, pos, hand)
            result[result.length-1] === 'L'? lH = num : rH = num
        }
    }

    return result;
}

 

2차원 배열로 만들어서 푸는 법도 있군.

 

훨씬 코드가 깔끔해지는거 같다.