본문 바로가기

개발/Algorithm

[프로그래머스] 키패드 누르기(python)

2021년 5월 24일 Algorithm, 프로그래머스, 키패드 누르기

2020년 카카오 인턴십

 

TL;DR

  • 주어진 문제의 조건을 구현할 수 있는지

문제 분석

1. 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
2. 왼쪽 열의 3개 숫자(1, 4, 7)를 입력할 때는 왼손을 사용합니다.
3. 오른쪽 열의 3개의 숫자(3, 6, 9)를 입력할 때는 오른손을 사용합니다.
4. 가운데 열의 4개의 숫자(2, 5, 8, 0)을 입력할 때는 두 엄지손가락의 현재 키패드 위치에서 더 가까운 엄지손가락을 사용합니다.
    4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.

 

- 1 : 엄지 손가락 간의 거리를 계산할 때의 조건을 제시한다. 대각선 길이로 구하지 않으며 상하좌우 각 거리를 1로 두고 계산한다.

- 2 ~ 3 : 무조건 왼손 또는 오른손만을 쓰는 경우의 수이다.

- 4 : 나머지 숫자에 대해 구현해야 하는 조건을 제시한다. 각 엄지손가락과 누르려는 키패드와의 거리를 계산하고, 더 가까운 거리에 있는 엄지손가락을 사용한다. 거리가 같다면 주로 사용하는 손의 엄지손가락을 사용한다.

입출력 형태

입출력 예시

 

- numbers : 눌러야 하는 키패드가 주어진다.

- hand : 주로 사용하는 손이 주어진다. 이 손에 따라, 엄지손가락과 키패드의 거리가 같을 때 누를 손가락을 구할 수 있다.

- result : 각 키패드를 어느 손 엄지손가락을 사용하였는지 문자열의 형태로 반환해야 한다.

풀이

PHONE = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
    ['*', 0, '#']
]

# 키패드의 위치 좌표를 반환하기 위한 함수이다.
def get_position(num):
    x, y = 0, 0
    for i in range(len(PHONE)):
        if num in PHONE[i]:
            x, y = i, PHONE[i].index(num)
    
    return (x, y)

# 엄지손가락과 키패드의 위치를 반환하기 위한 함수이다.
def get_distance(hand, number):
    return abs(hand[0] - number[0]) + abs(hand[1] - number[1])

def solution(numbers, hand):
    answer = ''
    l_position = get_position('*')
    r_position = get_position('#')
    
    for number in numbers:
        num_position = get_position(number)
        l_distance = get_distance(l_position, num_position)
        r_distance = get_distance(r_position, num_position)
        
        # 무조건 왼손, 또는 오른손을 사용하는 경우이다.
        if number in [1, 4, 7]:
            answer += 'L'
            l_position = num_position        
        elif number in [3, 6, 9]:
            answer += 'R'
            r_position = num_position
        else: 
        	# 조건에 따라 누를 엄지손가락이 바뀌는 경우이다.
            if l_distance < r_distance:
                answer += 'L'
                l_position = num_position
            elif r_distance < l_distance:
                answer += 'R'
                r_position = num_position
            else:
                if hand == 'left':
                    answer += 'L'
                    l_position = num_position
                else:
                    answer += 'R'
                    r_position = num_position

    return answer

 

반응형