[프로그래머스 Lv1] 키패드 누르기 (파이썬)

Jewon Joel Park·2022년 6월 1일
0

Programmers-solution

목록 보기
8/34

문제 링크


문제 설명

전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력할 때, 1/4/7은 왼손, 3/6/9는 오른손으로 입력하되 2/5/8/0은 키패드 위치에서 현재 위치가 더 가까운 손을 사용하도록하여, 입력된 수열을 "L" 또는 "R"로 변환하는 함수 작성


유의사항

  • 주로 쓰는 손이 파라미터로 주어지며, 눌러야할 키패드의 거리가 같을 경우 주로 쓰는 손을 사용하도록 설정
  • 기본 손가락 위치는 왼손은 "*", 오른손은 "#"에서 시작
  • 손가락은 상하좌우로만 움직임(eg. 대각선은 거리가 2)

풀이 코드

kp = {
    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]
}


def dist(point1, point2):
    y1, x1 = point1
    y2, x2 = point2
    return abs(y2-y1) + abs(x2-x1)


def solution(numbers, hand):
    result = ''
    lh_pos = kp["*"]
    rh_pos = kp["#"]
    
    for num in numbers:
        if num in [1, 4, 7]:
            lh_pos = kp[num]
            result += 'L'
        elif num in [3, 6, 9]:
            rh_pos = kp[num]
            result += 'R'
        else:
            if dist(rh_pos, kp[num]) < dist(lh_pos, kp[num]):
                rh_pos = kp[num]
                result += "R"
            elif dist(rh_pos, kp[num]) > dist(lh_pos, kp[num]):
                lh_pos = kp[num]
                result += 'L'
            else:
                if hand == "right":
                    rh_pos = kp[num]
                    result += "R"
                else:
                    lh_pos = kp[num]
                    result += 'L'
    return result

코드 설명

  1. 각 키패드의 좌표를 설정한 뒤 dict()타입 변수 kp에 저장, 거리를 확인할 수 있도록 두 위치를 받아서 수직수평 이동거리를 측정하는 함수 dist(좌표1, 좌표2) 작성
  2. 왼손과 오른손의 현재 좌표를 설정하고, 주어진 수열을 순환하며 각각 1/4/7 또는 3/6/9일 경우 현재 손위치를 변경하고 반환될 문자열에 "L" 또는 "R" 추가
  3. 2/5/8/0은 현재 손위치와 해당 키패드간의 거리를 비교하여 동작
  4. 두 손의 위치가 같을 경우, 오른손잡이와 왼손잡이를 구분하여 동작
  5. 최종적으로 생성된 문자열 result 반환
profile
10년을 돌고 돌아 마침내 제자리를 찾은 문과 출신 Python 개발자의 인생기록장

0개의 댓글