본문 바로가기
프로그래머스

프로그래머스: 키패드 누르기 | Python

by sxlvxrjxms2s2itsmes2s2 2024. 1. 25.

https://school.programmers.co.kr/learn/courses/30/lessons/67256

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 



- 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
- 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.
- hand는 "left" 또는 "right" 입니다."left"는 왼손잡이, "right"는 오른손잡이를 의미합니다.
- 왼손 엄지손가락을 사용한 경우는 L, 오른손 엄지손가락을 사용한 경우는 R을 순서대로 이어붙여 문자열 형태로 return 해주세요.

 

 

1. 풀이

처음에 keypad를 2차원리스트로 정렬했는데 이렇게 하니까 거리 계산이 어려워서 다른 분들의 풀이를 참고해 좌표로 구성된 딕셔너리를 생성했습니다.

 

def solution(numbers, hand):
    answer = ''
    keypad = {
        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)
    }
    left = keypad['*']   #처음 왼손의 위치
    right = keypad['#']  #처음 오른손의 위치
    
    for i in numbers:
        if i==1 or i==4 or i==7:
            answer += "L"
            left = keypad[i] #해당 번호 눌렀을 때 왼손 위치 저장
        elif i==3 or i==6 or i==9:
            answer += "R"
            right = keypad[i] #해당 번호 눌렀을 때 오른손 위치 저장
        else:
            #번호와 왼손의 거리 계산
            left_distance = abs(keypad[i][0] - left[0]) + abs(keypad[i][1] - left[1])
            #번호와 오른손의 거리 계산
            right_distance = abs(keypad[i][0] - right[0]) + abs(keypad[i][1] - right[1])
            
            if left_distance < right_distance:
                answer += "L"
                left = keypad[i]  # 왼손으로 눌렀을 때 왼손 위치 저장
            elif left_distance > right_distance:
                answer += "R"
                right = keypad[i]  # 오른손으로 눌렀을 때 오른손 위치 저장
            else:
                # 거리가 같다면 사용자의 주 손잡이에 따라 결정
                if hand == "left":
                    answer += "L"
                    left = keypad[i]
                else:
                    answer += "R"
                    right = keypad[i]

    return answer

 

 

딕셔너리와 튜플이 합쳐진 형태이므로

거리 계산의 형태를 헷갈리지 말아야 합니다.

 

dic = {"health" : (3,2,1), "running" : (4,5,6,8)} 일 경우
2에 접근하기 위해서는 dic["health"][1] 이 되어야 하고, 6에 접근하기 위해서는 dic["running"][2]이 되어야 합니다.