キーボードを押す


1.問題の説明


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

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

    [制限]

  • numbers配列の大きさは1000を超えない.
  • numbers配列要素の値が0または9以下の整数.
  • 孫  "left"  または  "right"  .
  • "left"左利きで、  "right"右利きを示す.
  • 左手親指使用時  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".

    2.理解

    let l = [1, 4, 7, 10] // 왼손
    let m = [2, 5, 8, 11] // 중앙
    let r = [3, 6, 9, 12] // 오른손
    左手固定[1,4,7]、右手固定[3,6,9].真ん中の[2,5,8,0]で左手でも右手でも最後の数字に近い手で押します.中央の数字0を押す必要がある場合、距離をより容易にするために、左手の*は10で、真ん中の0は11で、右手の#は12です.また、キーボードを押すたびに、押す数字と配列のインデックス値が保存され、移動距離が得られます.
    function solution(numbers, hand) {
        var answer = '';
        let l = [1, 4, 7, 10];
        let r = [3, 6, 9, 12];
        let m = [2, 5, 8, 11];
        let ltemp = 10;
        let rtemp = 12;
        let lidx = 3;
        let ridx = 3;
        for (let i = 0; i < numbers.length; i++) {
            let num = numbers[i];
            if (num === 0) num = 11
            if (l.indexOf(num) !== -1) {
                answer += 'L'
                lidx = l.indexOf(num);
                ltemp = num;
            } else if (r.indexOf(num) !== -1) {
                answer += 'R'
                ridx = r.indexOf(num);
                rtemp = num;
            } else if (m.includes(num)) {
                let midx = m.indexOf(num);
                let ld = lidx > midx ? lidx - midx : midx - lidx;
                let rd = ridx > midx ? ridx - midx : midx - ridx;
                if (!m.includes(ltemp)) ld++;
                if (!m.includes(rtemp)) rd++;
                if (ld > rd) {
                    answer += 'R';
                    rtemp = num;
                    ridx = midx;
                } else if (ld < rd) {
                    answer += 'L';
                    ltemp = num;
                    lidx = midx;
                } else if (ld === rd) {
                    if (hand === 'left') {
                        answer += 'L';
                        ltemp = num;
                        lidx = midx;
                    } else if (hand === 'right') {
                        answer += 'R';
                        rtemp = num;
                        ridx = midx;
                    }
                }
            }
        }
        return answer;
    }

    3.整理


    これは簡単な問題で、真ん中の数字を押すと、左手から中央の数字までの距離、右手から中央の数字までの距離を求め、近くの手に中央の数字を押させ、同じ時に手の「左」、「右」を押す.また、左手の*を10に、右手の#を12にすることで移動距離を得ることができます.しかし190行を超えるコードが書かれており、13日から20日までのテストケースは合格しなかった.条件文をたくさん書いても通らないのは、論理が足りないからです.엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.問題をもう一度読んで、見落としがあった.質問に答えがある.冷静に行こう