https://programmers.co.kr/learn/courses/30/lessons/67256

 

코딩테스트 연습 - 키패드 누르기

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

programmers.co.kr


def solution(numbers,hand):
    answer=''
    Left_current = 10
    Right_current = 12
    for x in numbers:
        if x==1 or x==4 or x==7:
            answer +='L'
            Left_current = x
        elif x==3 or x==6 or x==9:
            answer +='R'
            Right_current = x
        else:
            if x==0:
                x=11
                
            Ldis = abs(Left_current-x) //3 + abs(Left_current-x) %3
            Rdis = abs(Right_current-x) //3 + abs(Right_current-x) %3
            if Ldis > Rdis:
                answer +='R'
                Right_current = x
            elif Ldis < Rdis:
                answer +='L'
                Left_current =x
            else:
                if hand=='right':
                    answer +='R'
                    Right_current=x
                else:
                    answer+='L'
                    Left_current=x
    return answer


문제를 처음봤을 때 느낀점은 귀찮겠다.. 였다

이 풀이의 중점은 특수문자를 숫자로 치환한다는거다.

또 그걸이용해서 키패드 간의 거리를 나타낼 수 있다

 

 

1 2 3

4 5 6

7 8 9

10 11 12

 

이런식으로 치환하는것이다.

그렇다면 여기서 거리는 어떻게 구할 수 있을까?

각 키패드간의 거리는 무조건 1이라고 했으니까

각 키패드를 x,y값으로 생각하고 x값의 차 + y값의 차 = 키패드간의 거리가 된다.

그럼 키패드간의 거리는 어떻게 구할 수 있을까?

특성을 생각하면 간단하게 구할 수 있는데

예를들어서 1열을 예로들어보면

1 4 7 10 이다.

이는 3으로 나눴을때 몫이 +1씩 증가하는 규칙을 가지고 있다.

1//3=0 4//3=1 7//3=2 10//3=3

또 1행을 예로 들어서보면

1 2 3 인데 얘들은 3으로 나눴을때 나머지가 1 2 0 을 반복하는 형태로 나온다.

1%3=1 2%3=2 3%3=0

 

고로 이를 정리해보면 키패드간의 거리는

 

두 넘버패드의 거리차이 //3 + 두 넘버패드의 거리차이 %3 으로 정리할수 있겠다

 

가령

 

현재 왼손이 7,오른손이 6 목표가 2라고하면

abs((7-2)) // 3 + abs((7-2)) %3  = 1 + 2 = 3

왼손과 다음목표까지의 거리=3

abs((6-2))//3 + abs((6-2))%3 = 1 + 1 = 2

오른손과 다음목표까지의 거리 =2

 

따라서 오른손이 더 가까움을 알 수 있다.

 

 

+ Recent posts