[ココア実習生]キーボード[2020ココア実習生-等級1]Python


問題の説明


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

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

[制限]

  • numbers配列のサイズは1000を超えません.
  • numbers配列要素の値は0または9以下の整数です.
  • 手は「左」または「右」です.
  • 「左」は左利き、「右」は右利きを表す.
  • 左手親指を使用する場合はL、右手親指を使用する場合はRとなり、順番に接続され、文字列形式で返されます.

    I/O例



    I/O例説明


    I/O例#1
    順番は[1,3,4,5,8,2,4,5,9,5]、右利きです.

    そこで、「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」に変わります.

    コード#コード#

    def solution(numbers, hand):
        key_loc = [[3, 1], [0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]] # keypad 좌표
        left_loc, right_loc = [3, 0], [3, 2] # 맨 처음 시작 값은 왼손은 '*'위치 [3, 0] 오른손은 '#'위치 [3, 2]
        answer = []
        left_length, right_length = 0, 0
        hand = 'L' if hand == 'left' else 'R'
        
        for i in numbers:
            now_key = key_loc[i]
            if i in [1, 4, 7]: # 1, 4, 7
                answer.append('L')
                left_loc = now_key
            elif i in [3, 6, 9]: # 3, 6, 9
                answer.append('R')
                right_loc = now_key
            else: # 2, 5, 8, 0 (상, 하, 좌, 우의 길이를 비교해야 됨) 각 left_loc right_loc의 마지막 원소의 길이만 비교
                left_length = abs(now_key[1] - left_loc[1]) + abs(now_key[0] - left_loc[0]) if left_loc else 0
                right_length = abs(now_key[1] - right_loc[1]) + abs(now_key[0] - right_loc[0]) if right_loc else 0 
                
                if left_length < right_length: # 거리의 최솟값인 hand를 추가
                    answer.append('L')
                    left_loc = now_key
                elif left_length > right_length: 
                    answer.append('R')
                    right_loc = now_key
                else: # 거리가 같은 경우
                    answer.append(hand)
                    if hand == 'L': left_loc = now_key
                    else: right_loc = now_key
                
        return ''.join(answer)

    実施のための式をメモ帳に書き込む


    左側の現在のキーパッド2=>[0,1]右側の現在のキーパッド3=>[0,2]
    移動するキーボード8=>[2,1]
    |8行値-2行値|+|8列値-2列値|=2(オプション)
    |8行値-3行値|+|8列値-3列値|=3
    左側現在のキーパッド8=>[2,1]右側現在のキーパッド9=>[2,2]
    移動するキーボード2=>[0,1]
    |2行値-8行値|+|2列値-8列値|=2(オプション)
    |2行値-9行値|+|2列値-9列値|=3
    if |2 행값 - 8 행값| + |2 열값 - 8 열값| < |2 행값 - 9 행값| + |2 열값 - 9 열값|: answer.append('L')
    elif |2 행값 - 8 행값| + |2 열값 - 8 열값| > |2 행값 - 9 행값| + |2 열값 - 9 열값|: answer.append('R')
    else: # 거리가 같은 경우
        if hand == 'left': answer.append('L')
        else: answer.append('R')