[プログラマ/レベル1]キーボードを押す


問題の説明


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

この電話のキーボードには、左手と右手の親指で数字を入力したいだけです.
最初の左手親指は*キーボードから始まり、右手親指は#キーボードの位置から始まり、親指を使うルールは以下の通りです.
  • 親指は上下左右4方向にしか移動できず、キーボードを動かすセル距離は1です.
  • 左側の列の3つの数字1、4、7を入力する場合は、左手親指を使用してください.
  • 右側の列の3つの数字3、6、9を入力する場合は、右手親指を使用してください.
  • の4つの数字2、5、8、0を入力する場合は、2つの親指の現在のキーボード位置に近い親指を使用します.
    4-1. 2つの親指の距離が等しい場合は、右利きは右手親指、左利きは左手親指を使用します.
  • solution関数を完了して順序番号を示す配列番号、左利きか右利きかを示す文字列番号をパラメータとすると、各番号の親指が左手か右手かを示す連続文字列形式で返されます.
    [制限]
  • numbers配列のサイズは1000を超えません.
  • numbers配列要素の値は0または9以下の整数です.
  • 手は「左」または「右」です.
    「左」は左利き、「右」は右利きを表す.
  • 左手親指を使用する場合はL、右手親指を使用する場合はRとなり、順番に接続され、文字列形式で返されます.I/O例
    numbershandresult[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5]"right""LRLLLRLLRRL"[7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2]"left""LRLLRRLLLRR"[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]"right""LLRLLRLLRL"
    I/O例説明
    I/O例#1
    順番は[1,3,4,5,8,2,4,5,9,5]、右利きです.
    左手の位置を使用右手の位置を押す数字説明*#1 L 1を左手で押す.1#3 R 3を右手で押す.134 L 4を左手で押す.435 Lは左手距離が1、右手距離が2なので左手で5を押す.538 Lは左手距離が1、右手距離が3なので左手で8を押す.832 Rは左手距離が2、左手距離が2.右手距離は1なので右手で2を押す.821 L 1を左手で押す.124 L 4を左手で押す.425 R左手距離と右手距離は1なので右手で5を押す.459 R 9右手で5を押す.495 L左手距離は1、右手距離は2なので左手で5を押す.59---
    そこで、「LLLLLLRLL」に戻ります.
    I/O例#2
    左利きが[7,0,8,2,8,3,1,5,7,6,2]の順になると、使用する手は「LR」になります.
    I/O例#3
    右利きを[1,2,3,4,5,6,7,8,9,0]の順に押すと、使用する手が「LLRLRLL」に変わります.

    💻 に答える


    まだ解けてない...
    function solution(numbers, hand) {
        var answer = '';
       
        answer = typeof numbers[0]
        let numbersLF = numbers.map(num => {
            if(num === 1 || num ===  4 || num ===  7) {
                return 'L';
            } else if(num === 3 || num ===  6 || num ===  9) {
                return 'R';
            } else {
                return num;
            }
        });
       
        // 가운데 줄 숫자 전까지 LF확인해서 배열로 생성.
        let checkNum = []; // 가운데줄숫자인 요소들의 index배열.
        numbersLF.forEach((ele, index) => {
            if(typeof ele === 'number') {
                checkNum.push(index);
            }
        })
       
        // 가운데 줄 숫자 전 LF배열에서 마지막 L,F 추출.
        checkNum.forEach(ele => {
            for(let i = 0; i < ele; i++) {
                // 숫자 전까지 LF배열에서 마지막 L,F들 추출.
                let lastL = numbersLF.lastIndexOf('L'),
                    lastR = numbersLF.lastIndexOf('R');
                answer = {lastL, lastR};
            }
              
        })
       
        return answer;
    }
    
    // 1, 4, 7 = left
    // 3, 6, 9 = right
    // 2, 5, 8, 0 = 가까운쪽 
    
    // 1. 입력할 숫자로 왼쪽/오른쪽 판단
    // 1-1. 숫자가 2, 5, 8, 0일 경우 바로 전에 입력한 숫자로 거리따져서 판단
    // 1-2. 거리가 같을 경우 hand로 판단.
    // 2. 판단한 L/R이 나올때마다 생성해 놓은 배열에 넣어주기.