[프로그래머스] 키패드 누르기 (2020 카카오 인턴십)

시뮬레이션


해당 문제는 간단한 시뮬레이션 문제이다. 거리를 구하는 방법과 좌표에 대해 고민을 해야 하는 문제이다.

numbers 배열의 길이가 최대 1000이므로 O(N^2) 까지의 알고리즘을 사용해도 될 것으로 보인다.

코드는 아래와 같다.

def get_coord(keypad, num):
    r = 0
    c = 0
    for i in range(4):
        if num in keypad[i]:
            r = i
            c = keypad[r].index(num)
    return r, c

def get_manhattan_distance(r, c, tar_r, tar_c):
    return abs(r-tar_r) + abs(c-tar_c)

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

    # 별과 샾은 -1, -2로 초기화, 시작 위치 설정
    keypad = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [-1, 0, -2]]
    left_hand = -1
    right_hand = -2
    
    # 문자열 시작
    for number in numbers:
        # 왼손인 경우
        if number == 1 or number == 4 or number == 7:
            answer += 'L'
            left_hand = number
        # 오른손인 경우
        elif number == 3 or number == 6 or number == 9:
            answer += 'R'
            right_hand = number
        # 경합 경우
        else:
            left_r, left_c = get_coord(keypad, left_hand)
            right_r, right_c = get_coord(keypad, right_hand)
            tar_r, tar_c = get_coord(keypad, number)
            left_dist = get_manhattan_distance(left_r, left_c, tar_r, tar_c)
            right_dist = get_manhattan_distance(right_r, right_c, tar_r, tar_c)
            # 왼손이 더 가까우면
            if left_dist < right_dist:
                answer += 'L'
                left_hand = number
            # 오른손이 더 가까우면
            elif right_dist < left_dist:
                answer += 'R'
                right_hand = number
            # 양손이 같으면
            elif hand == "right":
                answer += 'R'
                right_hand = number
            else:
                answer += 'L'
                left_hand = number

    return answer

print(solution([1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5], "right"))