Programmers - 키패드 누르기
5. 키패드 누르기
입출력
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):
answer = ''
curL = 10 # 왼쪽 손 현재 위치 (= *)
curR = 12 # 오른쪽 손 현재 위치 (= #)
for number in numbers:
if number in [1,4,7]: # 왼쪽 손만 접근 가능
answer += 'L'
curL = number
elif number in [3,6,9]: # 오른쪽 손만 접근 가능
answer += 'R'
curR = number
else: # 가운데 배열
if number == 0: # 0번 패드를 11번으로 대치
number = 11
distL = distance(curL, number)
distR = distance(curR, number)
if distL == distR: # 왼손, 오른손 거리가 같으면
if hand == 'left': # 왼손 잡이
answer += 'L'
curL = number
else: # 오른손 잡이
answer += 'R'
curR = number
elif distL > distR: # 오른손이 더 가까우면
answer += 'R'
curR = number
else: # 왼손이 더 가까우면
answer += 'L'
curL = number
return answer
def distance(current, number):
if current == number: # 현재 손이 이미 키패드 위에 있을 때
return 0
up = float("inf")
down = float("inf")
# 손이 위로 움직일 때 최소 거리
upIdx = number
upCnt = 1
while upIdx >= 2:
if current == upIdx - 1 or current == upIdx + 1 or current == upIdx - 3 or current == upIdx + 3:
up = upCnt
break
upCnt+=1
upIdx -= 3
# 손이 아래로 움직일 때 최소 거리
downIdx = number
downCnt = 1
while downIdx <= 11:
if current == downIdx - 1 or current == downIdx + 1 or current == downIdx - 3 or current == downIdx + 3:
down = downCnt
break
downCnt+=1
downIdx += 3
if up > down:
return down
else:
return up
Author And Source
이 문제에 관하여(Programmers - 키패드 누르기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dev2danis/Programmers-키패드-누르기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)