내가 작성한 코드:
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을 반환한다.