프로그래머스 키패드 누르기 코드 및 해설 (파이썬)

2021. 6. 1. 15:45algorithm

반응형

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

 

solution 함수의 left엔 현재 왼손의 위치, right엔 현재 오른손의 위치를 저장하고, answer에 입력할 숫자에 따라 사용해야 할 손을 추가하는 방식으로 풀이했습니다. 1,4,73,6,9 등 손이 정해져 있는 경우는 정해져 있는 손으로 입력하도록 하고, 2,5,8,0의 경우 문제 설명에 따라 더 가까운 손이, 거리가 같다면 왼손잡이냐, 오른손잡이냐에 따라 선택하도록 했습니다.
이때 거리를 알기 위해 get_index 함수와 distance 함수를 사용했습니다. get_index 함수에선 키패드를 2d array로 보고, 숫자가 있는 [행,열]을 반환하도록 했습니다. distance 함수에선 이렇게 반환한 [행,열]을 활용하여, 입력해야할 숫자와 현재 왼손 또는 오른손이 있는 위치를 받아 인덱스의 차를 구해 거리를 계산했습니다.

 

# 키보드를 2d array로 보고 [행,열]을 반환하도록 함 
def get_index(number):
    if number not in [3,6,9, '#', '*', 0]:
        pos = [number//3, number%3-1]
    elif number in [3,6,9]:
        pos = [number//3-1, 2]
    else:
        if number == '*':
            pos = [3,0]
        elif number == 0:
            pos = [3,1]
        else:
            pos = [3,2]
    return pos

# 키보드를 2d array로 보고, 해당하는 index의 차를 구해 거리를 구함 
def distance(number, current_pos):
    distance = 0
    for x, y in zip(get_index(number), get_index(current_pos)):
        distance += abs(x-y)
    return distance
    

def solution(numbers, hand):
    answer = ''
    # 현재 왼손, 오른손의 위치 
    left = '*'
    right = '#'
    
    # 왼손, 오른손의 담당 번호들 
    lefts = [1,4,7]
    rights = [3,6,9]
    
    for number in numbers:
        # 1, 4, 7 
        if number in lefts:
            answer += 'L'
            left = number
        # 3, 6, 9
        elif number in rights:
            answer += 'R'
            right = number
        # 2, 5, 8, 0 
        else:
            # 왼손이 더 가까이 있으면 왼손이 
            if distance(number, left) < distance(number, right):
                answer += 'L'
                left = number 
            # 오른손이 더 가까이 있으면 오른손이 
            elif distance(number, left) > distance(number, right):
                answer += 'R'
                right = number 
            # 거리가 같으면 왼손잡이냐, 오른손잡이냐에 따라 결정 
            else:
                if hand == 'right':
                    answer += 'R'
                    right = number
                else:
                    answer += 'L'
                    left = number
    
    return answer
반응형