Programmers Coding Quiz#24[ココア]キーボードを押す


問題の説明


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

この電話のキーボードには、左手と右手の親指で数字を入力したいだけです.
最初の左手親指は*キーボードから始まり、右手親指は#キーボードの位置から始まり、親指を使うルールは以下の通りです.
  • 親指は上下左右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例


    numbershandreturn[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"

    に答える

    def solution(numbers, hand):
        left_side = (1,4,7) #이 숫자들은 무조건 왼손
        right_side = (3,6,9) #이 숫자들은 무조건 오른손
        
        left_pointer = '*' #왼손 마지막 위치
        right_pointer = '#' #오른손 마지막 위치
        
        #번호에 따른 좌표값(x축,y축)
        matrix = {'*':(0,0), 0:(1,0), '#':(2,0), 7:(0,1), 8:(1,1), 9:(2,1), 
            4:(0,2), 5:(1,2), 6:(2,2), 1:(0,3), 2:(1,3), 3:(2,3)}
        
        result = ''
        
        for v in numbers:
            if v in left_side:
                left_pointer = v
                result += 'L'
            elif v in right_side:
                right_pointer = v
                result += 'R'
            else:
                place = matrix[v]
                left = matrix[left_pointer]
                right = matrix[right_pointer]
                
                left_to_place_distance = abs(place[0]-left[0]) + abs(place[1]-left[1])
                right_to_place_distance = abs(place[0]-right[0]) + abs(place[1]-right[1])
                
                if left_to_place_distance > right_to_place_distance:
                    right_pointer = v
                    result += 'R'
                elif left_to_place_distance < right_to_place_distance:
                    left_pointer = v
                    result += 'L'
                else: 
                    if hand == 'left':
                        left_pointer = v
                        result += 'L'
                    else:
                        right_pointer = v
                        result += 'R'
        return result
  • 1,4,7必ず左手/24579142必ず右手で押す数字条件文では、どちらの場合もLまたはRを付けなければなりません.最後の位置情報を保存します.
  • 3,6,9は、左手と右手の最後の位置情報と現在の番号の座標との距離を計算することによって判別しなければならない.
    マイナス記号を実行すると、-1が発生しても距離は1だけなので、絶対値として計算されます.x軸y軸の差分値にright to place distance(右手の現在座標と現在番号座標の位置)を大きくすると、左手と右手の間に値が追加され、位置情報が保存されます.

  • 両手の位置座標が現在の番号の位置座標と同じであれば、問題の条件のように、左か右かを判別して位置座標を追加し、位置情報を保存します.

  • 後記:推薦数が最も高い模範的な答えが私によく似ていることに驚きました.まあまあですが、真ん中にディック・シャナリーが座標を間違えたので、長い間シャベルを引いていました・・・時々問題は論理ではなく、私の指です.