[프로그래머스/파이썬]2020 카카오 인턴십 : 키패드누르기

Jimin_Note·2022년 6월 19일
0
post-thumbnail

[프로그래머스/파이썬]2020 카카오 인턴십 : 키패드누르기

📍문제

  • 왼손과 오른손의 엄지손가락만을 이용해서 숫자만 입력
  • 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작
  • 상하좌우 4가지 방향으로만 이동가능 키패드 이동 한 칸은 거리 1에 해당
  • 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지 사용
  • 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지 사용
  • 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지 중 현재 키패드의 위치에서 더 가까운 엄지 사용
  • 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용
numbershandresult
[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"

  
def solution(numbers, hand):
    
    a=""
    l,r=10,12
    
    for i in numbers:
     if i==0:
       numbers[numbers.index(0)]=11
    
    for i in numbers:
       
        if i in [1,4,7] : #1,4,7이면 L
          a+='L'
          l=i
        
        elif i in [3,6,9] : #3,6,9 면 R
          a+='R'
          r=i
        else:
            rr=dist(r,i) #아래쪽 함수 확인
            ll=dist(l,i)
          
            if ll < rr:
                a+='L'
                l=i
              
            elif ll > rr:
                a+='R'
                r=i

            else: 
                if hand == 'left':
                    l=i
                    a+='L'
                else:
                    r=i
                    a+='R'  
    return a
  
def dist(r_or_l, i):
    a = { '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),
         '10': (3, 0), '11': (3, 1), '12': (3, 2)} #키패드에 해당하는 좌표부여
    
    x1, y1 = a[str(d)]
    x2, y2 = a[str(i)]
    return (abs(x1-x2),abs(y1- y2)

손가락이 어디에 있든 1,4,7는 왼쪽,3,6,9는 오른쪽으로 누를 것이 정해져 있기때문에 어렵지 않다.
2,5,8,0로 이동할 상황은 아래와 같이 구현하였다.

키패드 버튼간의 간격은 모두 1로 정해져있기 때문에 좌표 그래프라고 생각하고 손가락 이동시 대각선이 아닌 계단식으로 이동해야하기 때문에 맨하튼 거리 공식을 대입해보았다.

각 숫자 버튼에 해당하는 좌표를 부여하여 현재 좌,우 엄지가 위치한 버튼과 이동해야할 버튼사이의 거리를 각각 구하여 비교했을 때 거리가 더 짧은 손가락으로 이동하는 방식이다.

profile
Hello. I'm jimin:)

0개의 댓글