[#67256]2020 KACA実習生キーボード-JavaScriptを押す


問題の説明


スマートフォンの電話キーボードの各スペースには、次の数字があります.

この電話のキーボードには、左手と右手の親指で数字を入力したいだけです.
最初の左手親指は*キーボードから始まり、右手親指は#キーボードの位置から始まり、親指を使うルールは以下の通りです.
親指は上下左右4方向にしか移動できず、キーボードを動かすセル距離は1です.
左の列に1、4、7の数字を3つ入力する場合は、左手親指を使用します.
右の列の3つの数字3、6、9を入力する場合は、右手親指を使用します.
中間列の4つの数字2、5、8、0を入力する場合は、2つの親指の現在のキーボード位置に近い親指を使用します.
4-1. 2つの親指の距離が等しい場合は、右利きは右手親指、左利きは左手親指を使用します.
solution関数を完了して順序番号を示す配列番号、左利きか右利きかを示す文字列番号をパラメータとすると、各番号の親指が左手か右手かを示す連続文字列形式で返されます.

[制限]

  • numbers配列のサイズは1000を超えません.
  • numbers配列要素の値は0または9以下の整数です.
  • 手は「左」または「右」です.
  • 「左」は左利き、「右」は右利きを表す.
  • 左手親指を使用する場合はL、右手親指を使用する場合はRとなり、順番に接続され、文字列形式で返されます.

    I/O例



    I/O例説明


    I/O例#1
    順番は[1,3,4,5,8,2,4,5,9,5]、右利きです.

    したがって、"LRLLLRLLRRL"に戻ります.
    I/O例#2
    左利きは[7,0,8,2,8,3,1,5,7,6,2]を押して、使用する手は"LRLLRRLLLRR"です.
    I/O例#3
    右利きは[1,2,3,4,5,6,7,8,9,0]の順に押し,使用した手は"LLRLLRLLRL"であった.

    に答える

    1, 4, 7左手3, 6, 9右手を使うので、残りの値で判別します.(この場合、キーボード0にご注意ください!)
    次いで、2, 5, 8, 0は、座標キーPadを用いて距離を比較する.같을 경우が左利きか右利きかを確認して判別する.다를 경우より近い手で
    function solution(numbers, hand) {
        let answer = '';
    
        let leftHand = '*';
        let rightHand = '#';
    
        // keyPad 좌표화 참고
        const keyPad = {
            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]
        };
    
        const moveLeft = (num) => {
            leftHand = num;
            answer += 'L';
        };
    
        const moveRight = (num) => {
            rightHand = num;
            answer += 'R';
        };
    
    
        const distance = (lh, rh, num) => {
    
            const leftDistance = Math.abs(keyPad[lh][0] - keyPad[num][0]) + Math.abs(keyPad[lh][1] - keyPad[num][1]);
            const rightDistance = Math.abs(keyPad[rh][0] - keyPad[num][0]) + Math.abs(keyPad[rh][1] - keyPad[num][1]);
    
            if(leftDistance === rightDistance){
                if(hand === 'left') return moveLeft(num);
                else if(hand ==='right') return moveRight(num);
            }
    
            if(leftDistance > rightDistance){
                return moveRight(num);
            } else {
                return moveLeft(num);
            }
        };
    
    
        numbers.map( number => {
    
            // 좌측일 때
            if(number % 3 === 1){
                return moveLeft(number);
            }
            
            // 우측일 때
            if( number !== 0 && number % 3 === 0){
                return moveRight(number);
            }
    
            // 중앙일 때
            distance(leftHand, rightHand, number);
        });
        
        return answer;
    }