본문 바로가기

Algorithm

[프로그래머스] Python - 키패드 누르기

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

생각

현재 왼손과 오른손이 누르고있는 값을 저장하여 번호를 누를때마다 이 값을 갱신해줍니다.

 

이때 초기 시작 위치가 왼손은 '*' 이고 오른손은 '#'이기 때문에 초기값을 올바르게 설정해야 합니다.

(처음에 left,right =0,0 으로 초기화해서 테케 8번 15번을 틀렸습니다ㅠㅡㅠ)

 

그 다음 가운데 열 버튼을 누를때 현재 내가 누르고 있는 번호와 왼손이 가까운지 오른손이 가까운지 거리를 좌표값으로 비교합니다. 이를 위해 pad 2차원 배열을 선언하여 번호정보를 저장했습니다. 또한 target의 좌표 정보를 리턴해주는 getPos(target)함수를 만들었습니다. 

 

만약 거리값이 같다면 오른손잡이인지 왼손잡이인지를 체크하여 결과배열에 넣어줍니다.

Python Code

dy = [0,0,1,-1]
dx = [-1,1,0,0]
pad = [[1,2,3],[4,5,6],[7,8,9],['*',0,'#']]

def getPos(target):
    y,x = 0,0
    for i in range(4):
        for j in range(3):
            if pad[i][j] == target:
                y,x = i,j
                return y,x
            
def getDistance(now,target):
    ty,tx = getPos(target)
    ny,nx = getPos(now)
    return abs(ty-ny)+abs(tx-nx)
    
def solution(numbers, hand):
    answer = ''
    # 왼손 *  오른손 #
    left,right = '*','#'
    for n in numbers:
        if n in [2,5,8,0]:
            if(getDistance(n,left) > getDistance(n,right)) :
                right = n
                answer += 'R'
            elif (getDistance(n,left) < getDistance(n,right)) :
                left = n
                answer += 'L'
            else:
                if hand == 'right':
                    right = n
                    answer += 'R'
                else:
                    left = n
                    answer += 'L'
                
        elif n in [1,4,7]:
            answer += 'L'
            left = n
        elif n in [3,6,9]:
            answer += 'R'
            right = n
    
    return answer