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


プログラマー2020ココア実習生コードテストにおける問題


キーボード押下の問題

ぶんせき


問題を理解しながらも、どう実現すればいいのか悩んだ.
各番号の位置をx,y上の位置として表すことで,中央列を押す際に距離を容易に算出できる.

1.携帯電話の配列を実現


各番号に合った場所が保存されています.*、#から始まります.
phone = [[3,1],[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[2,0],[2,1],[2,2]]
赤の丸、左手の青の丸は右手、黄色の丸は番号

2.中央欄をクリックして手を近づける

  • 左手と番号を押す距離、右手と番号を押す距離を測定します.
    左手は押す番号と2の距離、右手は押す番号と2の距離です.
  • 左手または右手が近い場合は、->より近い手を使用します.
  • 両手で押す番号と同じ距離で、手オプションで主に使う手を使います.手が「right」なら右手を使います.
  • コード#コード#

    def check(pos1, pos2):
        return abs(pos1[0]-pos2[0])+abs(pos1[1]-pos2[1])
    
    def solution(numbers, hand):
        answer = ''
        phone = [[3,1],[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[2,0],[2,1],[2,2]]
        left, right = [3,0],[3,2]
        for i in numbers:
            if i in [1,4,7]:
                left = phone[i]
                answer+='L'
            elif i in [3,6,9]:
                right = phone[i]
                answer+='R'
            elif i in [2,5,8,0]:
                leftCnt = check(left, phone[i])
                rightCnt = check(right, phone[i])
                if leftCnt>rightCnt:
                    right = phone[i]
                    answer+='R'
                elif leftCnt<rightCnt:
                    left = phone[i]
                    answer+='L'
                else:
                    if hand=="right":
                        right = phone[i]
                        answer+='R'
                    else:
                        left = phone[i]
                        answer+='L'
        return answer