[アルゴリズムの問題]キーボードを押す


質問する



この電話のキーボードには、左手と右手の親指で数字を入力したいだけです.
最初の左手親指は*キーボードから始まり、右手親指は#キーボードの位置から始まり、親指を使うルールは以下の通りです.
親指は上下左右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以下の整数です.
handは「left」または「right」です.
「左」は左利き、「右」は右利きを表す.
左手親指を使う場合はL、右手親指を使う場合はRを順番につなぎ、文字列で返します.

コード#コード#

const keyPad = [[1, 2, 3],
[4, 5, 6],
[7, 8 ,9],
['*', 0, '#']];

// 키 위치 반환 함수
function getPosition(key) {
    for (let i = 0; i < keyPad.length; i++) {
        if (keyPad[i].indexOf(key) !== -1) {
            return [i, keyPad[i].indexOf(key)];
        }
    }
}

// 키와 키 사이의 거리 반환 함수
function getDistance(position, number) {
    return Math.abs(position[0] - number[0]) + Math.abs(position[1] - number[1]);
}

function solution(numbers, hand) {
    // 초기 손가락 위치 설정
    let leftIndex = getPosition('*');
    let rightIndex = getPosition('#');
    
    let result = numbers.map((el) => {
        let currentKeyIndex = getPosition(el);

        // 왼손과 오른손이 확정적인 경우에 대한 조건문
        if (el === 1 || el === 4 || el === 7) {
            leftIndex = currentKeyIndex;
            return 'L';
        }
        if (el === 3 || el === 6 || el === 9) {
            rightIndex = currentKeyIndex;
            return 'R';
        }

        // 현재 누를 키의 왼손과 오른손에 대한 거리 계산
        let leftDistance = getDistance(leftIndex, currentKeyIndex);
        let rightDistance = getDistance(rightIndex, currentKeyIndex);

        // 거리가 같은 경우 주 손잡이로 반환
        if (leftDistance === rightDistance) {
            if (hand === "left") {
                leftIndex = currentKeyIndex;
                return 'L';
            }
            if (hand === "right") {
                rightIndex = currentKeyIndex;
                return 'R';
            }
        }

        // 더 가까운 손 반환
        if (leftDistance < rightDistance) {
            leftIndex = currentKeyIndex;
            return 'L';
        }
        if (leftDistance > rightDistance) {
            rightIndex = currentKeyIndex;
            return 'R';
        }
    })

    // 문자열로 반환
    return result.join('');
}

풀이

  • キーのgetPosition関数を定義し、キーとキーの間の距離を決定します.
  • 問題で提案する左右の手の初期位置を設定後、map順に要素
  • を配列する.
  • 左右手で定める条件文処理
  • 現在のヌルキの左手と右手の距離計算
  • の距離とメインハンドルにより、位置を更新L/Rの
  • に戻る.
  • joinメソッドを使用して配列を文字列に変換し、
  • を返します.
    出典:プログラマーコードテスト練習、https://programmers.co.kr/learn/challenges