키패드 누르기

웹 개발자(백엔드)·2021년 9월 14일
0

내가 작성한 코드:

def solution(numbers, hand):
    answer = ''
    tmpL=''
    tmpR=''
    for x in numbers:
        if x in (1, 4, 7):
            answer+=L
        elif x in (3, 6, 9):
            answer+=R
        else:

너무 어렵다..
각 숫자들을 리스트로 매핑해서 딕셔너리를 만든다.
거리 계산: A(a1, a2), B(b1, b2) 이렇게 두 점이 있으면, AB의 거리(길이)를 구한다고 하면 (b1-a1)^2+(b2-a2)^2로 구함.

두번째 내가 작성한 코드:

def solution(numbers, hand):
    answer = ''
    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]}
    lastL=dict['*']
    lastR=dict['#']
    for x in numbers: #key로 value얻는법 함수:get()
        if x in (1, 4, 7):
            answer+='L'
            lastL=dict.get(x)
        elif x in (3, 6, 9):
            answer+='R'
            lastR=dict.get(x)
        else:
            a=dict.get(x)
            if ((a[0]-lastL[0])**2)+((a[1]-lastL[1])**2)==((a[0]-lastR[0])**2)+((a[1]-lastR[1])**2):
                if hand=="left":
                    answer+='L'
                    lastL=dict.get(x)
                else:
                    answer+='R'
                    lastR=dict.get(x)
            elif ((a[0]-lastL[0])**2)+((a[1]-lastL[1])**2)<((a[0]-lastR[0])**2)+((a[1]-lastR[1])**2):
                answer+='L'
                lastL=dict.get(x)
            else:
                answer+='R'
                lastR=dict.get(x)
            
    return answer

테스트케이스 13~20번이 통과가 안됨.
피타고라스 풀이로 풀면 안됨
-> 단순히 x이동량, y이동량 합으로 거리를 측정해야함.
왜냐하면 눌러야하는 수가 8 왼손이 4 오른손이 2그리고 오른손잡이일때 문제가 생김.

문제에서 제시한 거리로 계산하면 왼손과 오른손이 8로부터 '2'만큼 떨어져있기에 오른손으로 눌러야하지만, 그냥 좌표놓고 거리로 계산하면, 왼손으로 누를것임.

해결책:
x이동량, y이동량 어떻게 구하지?
생각보다 쉽구나~

def solution(numbers, hand):
    answer = ''
    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]}
    lastL=dict['*']
    lastR=dict['#']
    for x in numbers: #key로 value얻는법 함수:get()
        if x in (1, 4, 7):
            answer+='L'
            lastL=dict.get(x)
        elif x in (3, 6, 9):
            answer+='R'
            lastR=dict.get(x)
        else: #여기 구하는게 관건.
            a=dict.get(x)
            if (abs(a[0]-lastL[0]))+(abs(a[1]-lastL[1]))==(abs(a[0]-lastR[0]))+(abs(a[1]-lastR[1])):
                if hand=="left":
                    answer+='L'
                    lastL=dict.get(x)
                else:
                    answer+='R'
                    lastR=dict.get(x)
            elif (abs(a[0]-lastL[0]))+(abs(a[1]-lastL[1]))<(abs(a[0]-lastR[0]))+(abs(a[1]-lastR[1])):
                answer+='L'
                lastL=dict.get(x)
            else:
                answer+='R'
                lastR=dict.get(x)
            
    return answer

끝!!

한가지 알아야 할 점은,
딕셔너리의 value에 접근할 때 2가지 방법이 있는데,
1) dict['*']
2)dict.get('*') get함수를 이용해서 하는 것.
이중 차이점은 첫번째는 존재하지 않은 키로 값을 가져오려 할 때는, 오류가 나고 두번째는 none을 반환한다.

0개의 댓글