두 키패드 사이의 거리를 구하는 것이 핵심인 문제였다.

(키패드 숫자 - 1) / 3 의 결과인 (몫, 나머지)는 키패드를 2차원 배열로 보았을 때 숫자의 위치 (y, x)와 같다.
두 점 (y1, x1), (y2, x2) 사이를 대각선으로 가로지르지 않는 거리는 |y1-y2| + |x1-x2| 이다.

이제 위의 두 사실을 이용하여 두 키패드 사이의 거리를 구할 수 있다.

LEFT_NUMBERS = [1, 4, 7]
RIGHT_NUMBERS = [3, 6, 9]
LEFT_HAND = 0
RIGHT_HAND = 1
LEFT_HANDED = 'left'
RIGHT_HANDED = 'right'
STAR = 10
SHARP = 12
ZERO = 0


def solution(numbers, handed):
    left, right = STAR, SHARP
    result = ''

    for number in numbers:
        if number == 0:
            number = ZERO

        if number in LEFT_NUMBERS:
            hand = LEFT_HAND

        elif number in RIGHT_NUMBERS:
            hand = RIGHT_HAND
        else:
            hand = find_closest_hand_to_mid_number(number, left, right, handed)

        if hand == LEFT_HAND:
            left = number
            result += 'L'
        else:
            right = number
            result += 'R'

    return result


def find_closest_hand_to_mid_number(mid, left, right, handed):
    if get_distance(mid, left) < get_distance(mid, right):
        return LEFT_HAND

    elif get_distance(mid, left) > get_distance(mid, right):
        return RIGHT_HAND

    else:
        if handed == LEFT_HANDED:
            return LEFT_HAND
        else:
            return RIGHT_HAND


def get_distance(spot1, spot2):
    spot1_y, spot1_x = divmod(spot1 - 1, 3)
    spot2_y, spot2_x = divmod(spot2 - 1, 3)

    return abs(spot1_y - spot2_y) + abs(spot1_x - spot2_x)

+ 따끈한 최근 게시물