PROGRAMMERS Python Lv1. 키패드 누르기
이번 문제는 키패드 누르기이다.
나의 코드는 다음과 같다.
def solution(numbers, hand):
answer = ''
r_location = 12
l_location = 10
for n in numbers:
if n in [1,4,7]:
answer += 'L'
l_location = n
elif n in [3,6,9]:
answer += 'R'
r_location = n
else:
n = 11 if n == 0 else n
absL = abs(n-l_location)
absR = abs(n-r_location)
if sum(divmod(absL, 3)) > sum(divmod(absR, 3)):
answer+='R'
r_location = n
elif sum(divmod(absL, 3)) < sum(divmod(absR, 3)):
answer +='L'
l_location = n
else:
if hand == 'left':
answer+='L'
l_location = n
else:
answer+='R'
r_location = n
return answer
한시간 정도 고민하며 풀다 답의 절반까지 맞추고 나서 그 이후는
구글을 통해 다른 사람의 풀이를 참고했다.
이 문제를 풀기 위해선 다음과 같은 생각이 필요했다.
-
1,4,7의 키패드는 “L”
-
3,6,9의 키패드는 “R”
이 두가지는 변함없는 것이다. 그렇다면 다음 두가지를 집중해서 봐야한다.
-
2,5,8,0을 어떻게 고를 건지가 이 문제의 관건이다.
-
왼손과 오른손의 가장 최근 위치를 기억할 공간이 필요하다.
이 두가지를 기억한 후 코드로 적어보면 다음과 같다.
def solution(numbers, hand):
answer = ''
r_location = 12
l_location = 10
for n in numbers:
if n in [1,4,7]:
answer += 'L'
l_location = n
elif n in [3,6,9]:
answer += 'R'
r_location = n
이 부분까진 쉽게 접근할 수 있다. 시작 위치인 * / # 을 각각 10 과 12로 지정해줬다.
이 다음부분을 풀기 위해 해결해야 했던 문제는
과연 각각의 위치와 다음에 눌러야 할 번호의 거리를
어떻게 계산할 것인가이다.
단순히 2와 5의 거리를 뺄셈으로 계산하면 3이지만
이 둘의 거리는 1이기 때문에 이를 해결해야 한다.
해답은 바로 divmod 함수이다.
2,5,8,0 이 숫자들의 거리는 3씩 차이난다.
else:
n = 11 if n == 0 else n
여기서 0도 11로 바꿔주면 계산이 편하다.
따라서 divmod를 이용해서 3으로 나눈 몫과 나머지를
더해준다면 그것이 거리가 될 것이다.
이를 비교해주고 만약 거리가 같을 경우,
hand를 이용해줘서 hand에 맞는 answer를 더해주면 된다.
댓글남기기