[2020 카카오인턴] 키패드누르기

2020. 7. 29. 00:10카테고리 없음

https://programmers.co.kr/learn/courses/30/lessons/67256

 

코딩테스트 연습 - 키패드 누르기

[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"

programmers.co.kr

키패드에 있는 각 번호에 대한 좌표를 딕셔너리 keypads로 저장하였다.

사용자가 누른 번호 number에 따라 분기

number 3 또는 6 또는 9 이면 항상 오른손이 누르기 때문에 'R'
2) number1 또는 4 또는 7 이면 항상 왼손이 누르기 때문에 'L'
3) 1) 또는 2)의 경우가 아닐 경우 → findHand 함수 호출

findHand 함수

  • number : 사용자가 누른 번호
  • rightHand: 오른손이 최근에 누른 번호
  • leftHand: 왼손이 최근에 누른 번호
  • hand: 사용자가 주로 사용하는 손

1-1) 키패드에서 number와 rightHand의 상대적 거리 rightDist 구하기

1-2) 키패드에서 number와 leftHand의 상대적 거리 leftDist 구하기

2-1) 상대적거리 rightDist와 leftDist가 동일할 경우 사용자가 주로 쓰는 hand 값 반환

2-2) rightDist가 leftDist 클 경우, lefthand 'L'값 반환

2-3) leftDist가 rightDist 클 경우, righfthand 'R'값 반환

 

keypads= {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)}

def findHand(number, rightHand, leftHand, hand):
    rightDist = abs(keypads[number][0] - keypads[rightHand][0]) + abs(keypads[number][1] - keypads[rightHand][1])
    leftDist = abs(keypads[number][0] - keypads[leftHand][0]) + abs(keypads[number][1] - keypads[leftHand][1])
    if rightDist == leftDist:
        if hand == 'right':
            return 'R'
        elif hand == 'left':
            return 'L'
    elif rightDist > leftDist:
        return 'L'
    elif rightDist < leftDist:
        return 'R'

def solution(numbers, hand):
    answer = ''
    movedHand, rightHand, leftHand = '', '#', '*'
    for number in numbers:
        if number in [3, 6, 9]:
            movedHand = 'R'
        elif number in [1, 4, 7]:
            movedHand = 'L'
        else:
            movedHand = findHand(number, rightHand, leftHand, hand)
        if movedHand == 'R':
            rightHand = number
        elif movedHand == 'L':
            leftHand = number
        answer += movedHand
    return answer