https://programmers.co.kr/learn/courses/30/lessons/67256
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
따라서 오른손이 더 가까움을 알 수 있다.
'취준 > 프로그래머스' 카테고리의 다른 글
소수만들기 - 파이썬 (0) | 2022.05.21 |
---|---|
인형뽑기 - 파이썬 (0) | 2022.05.19 |
로또의 최고 순위와 최저 순위 - 파이썬 (0) | 2022.05.12 |
신규 아이디 추천 - 파이썬 (0) | 2022.05.10 |
신고 결과받기 - 프로그래머스 (0) | 2022.05.10 |