[프로그래머스/파이썬]2020 카카오 인턴십 : 키패드누르기
📍문제
- 왼손과 오른손의 엄지손가락만을 이용해서 숫자만 입력
- 왼손 엄지손가락은
*
키패드에 오른손 엄지손가락은#
키패드 위치에서 시작- 상하좌우 4가지 방향으로만 이동가능 키패드 이동 한 칸은 거리 1에 해당
- 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지 사용
- 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지 사용
- 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지 중 현재 키패드의 위치에서 더 가까운 엄지 사용
- 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용
numbers | hand | result |
---|---|---|
[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로 정해져있기 때문에 좌표 그래프라고 생각하고 손가락 이동시 대각선이 아닌 계단식으로 이동해야하기 때문에 맨하튼 거리 공식을 대입해보았다.
각 숫자 버튼에 해당하는 좌표를 부여하여 현재 좌,우 엄지가 위치한 버튼과 이동해야할 버튼사이의 거리를 각각 구하여 비교했을 때 거리가 더 짧은 손가락으로 이동하는 방식이다.