[プログラマー/Javascript]52秘密の地図


問題の説明


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

この電話のキーボードには、左手と右手の親指で数字を入力したいだけです.
最初の左手親指は*キーボードから始まり、右手親指は#キーボードの位置から始まり、親指を使うルールは以下の通りです.
  • 親指は上下左右4方向にしか移動できず、キーボードを動かすセル距離は1です.
  • |左の列の3つの数字
  • 14を入力する場合は、左手親指を使用してください.
  • 右側の列の3つの数字73および6を入力する場合は、右手親指を使用してください.
  • 中間列の4つの数字9258および0を入力する場合は、2つの親指の現在のキーボード位置に近い親指を使用します.
    4-1. 両亲指の距离が等しい场合は、右利きは右手亲指、左利きは左手亲指を使います.
  • 次のタスクを完了します:順序番号の配列numbers、左利きか右利きかを示す文字列handをパラメータとして与えると、各番号の親指が左手か右手かを示す連続文字列形式solution関数が返されます.

    せいげんじょうけん

  • numbers配列のサイズは1または1000未満です.
  • numbers配列要素の値は0または9以下の整数です.
  • handは「左」または「右」である.
    -「左」は左利き、「右」は右利き.
  • 左手親指を使用する場合は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"

    に答える

    let num = [[1, 4, 7, '*'],[2, 5, 8, 0],[3, 6, 9, '#']] //번호를 '열' 기준으로 2차원 배열
    function distance(now, end){ // 현재 위치와 목적위치를 파라미터로 받는 거리계산 함수
        let count = 0
        let now_place = num.indexOf(num.find(a=>a.includes(now))) 
        let end_place = num.indexOf(num.find(a=>a.includes(end)))   // 현재 위치와 목적 위치의 num 인덱스(열)을 구한다.
        let col_dis = Math.abs(num[end_place].indexOf(end) - num[now_place].indexOf(now)) // 행 간의 길이
        let row_dis = Math.abs(end_place - now_place) // 열 간의 길이
    
        if(now_place == end_place) {
            return col_dis  // 열이 서로 같다면 행 간의 길이만 return
        }
        else{
            return row_dis + col_dis // 열이 서로 다르다면 열 간의 길이 + 행 간의 길이를 총 길이로 return
        }
    }
    
    function solution(numbers, hand) {
        let left = '*'
        let right = '#' // 첫 위치 설정
        let answer = '' 
        
        for(let i = 0; i < numbers.length; i++){    
            let t = numbers[i]
            if(t % 3 == 0 && t !== 0){  // 0을 제외하고 나머지가 0일 경우 오른손 위치 이동 및 'R' 추가
                right = t
                answer += 'R'
            } else if(t % 3 == 1){  // 나머지 1일 경우 왼손 위치 이동 및 'L' 추가
                left = t
                answer += 'L'
            } else if(t % 3 == 2 || t == 0){    // 0이거나 나머지가 2일 경우
                if(distance(left, t) < distance(right, t)){ 
                    left = t
                    answer += 'L'
                } else if(distance(left, t) > distance(right, t)){
                    right = t
                    answer += 'R'                   // 거리 함수 비교
                } else if(distance(left, t) == distance(right, t)){
                    if(hand == "right"){    // 같을 경우 왼손잡이 오른손잡이 확인
                        right = t
                        answer += 'R'
                    }else{
                        left = t
                        answer += 'L'
                    }
                }
            }
        }
        
        return answer
    }

    説明:


    この問題の解答はかなり長いので、すべての状況の数を考えると、そうらしい.各数値を列ごとに含む2 D配列を宣言し、始点と終点の距離を求める関数を確立します.そしてforゲートを回り、状況の数を一つ一つ考えました.