본문 바로가기
Algorithm/Programmers

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

by 원만사 2022. 5. 5.
반응형
 

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

[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

 

풀이

 키패드에서 각 버튼의 위치를 행과 열의 좌표로 생각한다. 문제에서 주어진 것처럼 숫자 1, 4, 7의 경우는 왼손을 이동시키고 숫자 3, 6, 9의 경우는 오른손을 이동시키면 된다.

 

 숫자 2, 5, 8, 0은 눌러야 하는 숫자의 좌표를 구하고 현재 왼손과 오른손의 위치에서 얼마나 떨어져 있는지를 구한다. 이를 비교하여 제일 가까이 있는 손을 이동시키면 되나 만약 거리가 같으면 입력으로 주어지는 hand를 참고하여 오른손 잡이면 오른손을, 왼손 잡이면 왼손을 이동시키도록 한다. 

 

코드

def solution(numbers, hand):
    answer = ''

    leftHand = (3, 0) # 처음 왼손 위치
    rightHand = (3, 2) # 처음 오른손 위치 

    for number in numbers:
        if number == 0 or number % 3 == 2: # 2, 5, 8, 0
            # 2, 5, 8, 0에 대하여 숫자의 위치 설정
            if number == 0:
                numberXY = (3, 1)
            else:
                numberXY = (number // 3, 1)

            # 왼손과 오른손에서의 거리
            leftDistance = abs(leftHand[0] - numberXY[0]) + abs(leftHand[1] - numberXY[1])
            rightDistance = abs(rightHand[0] - numberXY[0]) + abs(rightHand[1] - numberXY[1])

            if leftDistance < rightDistance: # 왼손이 더 가까울 경우
                leftHand = numberXY
                answer += 'L'
            elif leftDistance > rightDistance: # 오른손이 더 가까울 경우
                rightHand = numberXY
                answer += 'R'
            else: # 위치가 같을 경우 오른손 잡이인지 왼손 잡이인지 판단하여 달라진다
                if hand == 'right':
                    rightHand = numberXY
                    answer += 'R'
                else:
                    leftHand = numberXY
                    answer += 'L'

        elif number % 3 == 1: # 1, 4, 7
            answer += 'L'
            leftHand = (number // 3, 0)

        else: # 3, 6, 9
            answer += 'R'
            rightHand = (number // 3 - 1, 2)

    return answer
반응형

댓글