본문 바로가기

두두의 알고리즘/문제

[기타] 프로그래머스 L1 '키패드 누르기' (Python)

728x90

<문제 링크>

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


<문제 풀이>

1. 키패드의 좌표를 변수로 지정한다

2. 왼쪽, 오른쪽 시작 위치를 *, #으로 지정한다

3. 1,4,7일 때는 왼손, 3,6,9일 때는 오른손을 출력한다

4. 이외 숫자를 누를 때는 현재 양쪽 손의 거리(손좌표x-숫자좌표x) + (손좌표y-숫자좌표y)를 절대값으로 구해서 더 가까운 손으로 출력한다.

5. 4번 값이 동일하다면 왼손잡이, 오른손잡이로 출력한다.

 

<코드>

def solution(numbers, hand):
    answer = ''
    key_dict = {1:(0,0),2:(0,1),3:(0,2),
                4:(1,0),5:(1,1),6:(1,2),
                7:(2,0),8:(2,1),9:(2,2),
                '*':(3,0),0:(3,1),'#':(3,2)}

    lhand = '*'
    rhand = '#'
    
    for i in numbers:
        if i in [1,4,7]:
            answer += 'L'
            lhand = i
        elif i in [3,6,9]:
            answer += 'R'
            rhand = i
        else:
            curPos = key_dict[i]
            lPos = key_dict[lhand]
            rPos = key_dict[rhand]
            ldist = abs(curPos[0]-lPos[0]) + abs(curPos[1]-lPos[1])
            rdist = abs(curPos[0]-rPos[0]) + abs(curPos[1]-rPos[1])

            if ldist < rdist:
                answer += 'L'
                lhand = i
            elif ldist > rdist:
                answer += 'R'
                rhand = i
            else:
                if hand == 'left':
                    answer += 'L'
                    lhand = i
                else:
                    answer += 'R'
                    rhand = i

    return answer

 

<고쳐야 할 점>

  • (x1,y1)와 (x2,y2)가 상하좌우로만 움직일 수 있을 때, 거리는 abs(x1-x2)+abs(y1-y2)로 구한다
  • 복습 알고리즘