https://school.programmers.co.kr/learn/courses/30/lessons/67256
전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
[제한사항]
입출력 예 #2
왼손잡이가 [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2]를 순서대로 누르면 사용한 손은 "LRLLRRLLLRR"이 됩니다.
입출력 예 #3
오른손잡이가 [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]를 순서대로 누르면 사용한 손은 "LLRLLRLLRL"이 됩니다.
그냥 구현문제인데 구현을 어떻게 할지 어려웠음 (시간 많이 씀)
2, 5, 8, 0과 왼손엄지, 오른손엄지와의 거리를 재야 하는 부분에서 애를 많이 먹음
dis = {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), -1:(3,0), 0:(3,1), -2:(3,2)}
결국 각 숫자에 해당하는 좌표를 딕셔너리에 담아서 해결
그러나..
disl = (((dis[l][0]-dis[n][0])** 2) + ((dis[l][1]-dis[n][1])**2))*(1/2) #l과의 거리
disr = (((dis[r][0]-dis[n][0])** 2) + ((dis[r][1]-dis[n][1])**2))*(1/2) #r과의 거리
처음에는 거리를 이렇게 구했더니 테스트케이스 13번부터 틀렸다고 나옴.. 아마 시간 초과인 것 같았음
그래서 생각을 바꿨다. 각 좌표의 거리를 굳이 피타고라스식으로 구할 필요 없이, 행좌표간의 차이, 열좌표간의 차이를 더하기만 하면 어쨌든 상대적인 거리가 나오지 않을까?
절대적인 거리 값은 필요 없다. 누가 더 가까운지 정하기만 하면 돼서..
disl = abs(dis[l][0]-dis[n][0])+abs(dis[l][1]-dis[n][1])
disr = abs(dis[r][0]-dis[n][0])+abs(dis[r][1]-dis[n][1])
예) 지금 n이 2,1에 있고 왼손이 0,0 오른손이 1,2에 있으면 오른손이 가깝다
왼손이랑은 3 차이지만 오른손이랑은 2 차이...
그래서 어떻게든 맞음. 꽤 오래 걸렸다
dis = {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), -1:(3,0), 0:(3,1), -2:(3,2)}
def solution(numbers, hand):
answer = ''
l, r = -1, -2
for n in numbers:
if n==1 or n==4 or n==7:
answer += 'L'
l = n
elif n==3 or n==6 or n==9 :
answer += 'R'
r = n
else :
#거리 구하기
disl = abs(dis[l][0]-dis[n][0])+abs(dis[l][1]-dis[n][1])
disr = abs(dis[r][0]-dis[n][0])+abs(dis[r][1]-dis[n][1])
if disl < disr: #왼손이 더 가까우면
l = n
answer += 'L'
elif disl == disr: #같은거리면
if hand=="right":
r=n
answer += 'R'
else:
l=n
answer += 'L'
else : #오른손이 더 가까우면
r= n
answer += 'R'
return answer
구글링을 좀 하긴 했는데 다 베낀 건 아니고 거리 구하는 부분 힌트 얻으려고 함