Kakaoキーボードを押す


質問:
( https://programmers.co.kr/learn/courses/30/lessons/67256 )
最初は二次元配列を使いたくなかった.
だから私はコードを書いて、#と*の代わりに数字を使って、それから小さい手で数字の和の差の絶対値を押して、しかしすぐに問題を発見しました.
def solution(numbers, hand):
    answer = ''
    l = 10 #왼손 오른손의 위치 저장
    r = 12
    
    left = [1,4,7]
    right = [3,6,9]
    
    #목표치와의 차의 절대값 작은 손이 누름
    if hand == "right":
        for num in numbers:
            if num in left:
                l = num
                answer += "L"
            elif num in right:
                    r = num
                    answer += "R"
            else:
                if(abs(num-r) <= abs(num-l)): 
                    r =num
                    answer += "R"
                else:
                    l =num
                    answer+="L"
            
    else:
         for num in numbers:
            if num in left:
                l = num
                answer += "L"
            elif num in right:
                    r = num
                    answer += "R"      
            else:
                if(abs(num-r) <abs(num-l)): 
                    r =num
                    answer += "R"
                else:
                    l =num
                    answer+="L"
    #0을 누르려 할 때 #보다 7이 가깝게 계산되는 문제가 있음.
    return answer
与えられたリストに0がある場合は、11に変更してみましたが失敗しました.
そこで,2次元配列に変換する際には,行を3のシェア,列を3の残り+1に分けて解くことを試みたが,演算中にエラーが発生した.
こうして地面をかき集めると...最初の考えをよく表すコードが見つかった.
https://life-of-panda.tistory.com/75
横距離abs(右(または左)-num)%3、縦距離abs(右-num)/3、和(divmod(右-num,3)で距離を求めることができます!
そして手は同じ状況で左か右かを確認するだけでいいので、最初から区別したいようなので音量だけ増やしました.
配列を直接描いても,3とインデックスの関係が分かっても,実際に実現することは難しい.
通常、以下のように座標をディクシャナに格納し、問題を解決するために使用します.
def solution(numbers, hand):
    answer = ''
    key_dict = {1:(0,0),2:(0,1),3:(0,2),
                4:(1,0),5:(1,1),6:(1,2),
                7:(2,0),8:(2,1),9:(2,2),
                '*':(3,0),0:(3,1),'#':(3,2)}

    left = [1,4,7]
    right = [3,6,9]
    lhand = '*'
    rhand = '#'
    for i in numbers:
        if i in left:
            answer += 'L'
            lhand = i
        elif i in right:
            answer += 'R'
            rhand = i
        else:
            curPos = key_dict[i]
            lPos = key_dict[lhand]
            rPos = key_dict[rhand]
            ldist = abs(curPos[0]-lPos[0]) + abs(curPos[1]-lPos[1])
            rdist = abs(curPos[0]-rPos[0]) + abs(curPos[1]-rPos[1])

            if ldist < rdist:
                answer += 'L'
                lhand = i
            elif ldist > rdist:
                answer += 'R'
                rhand = i
            else:
                if hand == 'left':
                    answer += 'L'
                    lhand = i
                else:
                    answer += 'R'
                    rhand = i

    return answer