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

이진규·2022년 1월 10일
1
post-thumbnail

문제

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

나의 코드

'''
1. 아이디어
빈 리스트 안에 각 번호에 해당하는 인덱스 값을 기록해 놓는다.
그 다음에는 숫자 키패드를 입력할려고 할때마다 숫자 키패드와 현재 왼쪽 손과 
오른쪽 손이 있는 위치와의 거리를 구한다음 계속 비교해서 거리가 가까운 손가락을 움직인다. 
(움직이면 움직인 손가락(왼쪽 or 오른쪽)의 위치를 계속 갱신해준다.)

2. 시간복잡도
for문안에 대소비교 연산자 밖에 없으므로 O(N)일 것으로 추측된다.
'''

def solution(numbers, hand):
    
    result = ''
    
    # 키패드에 대한 좌표를 기록한다. [ 0:(3, 1) , 1:(0, 0) ~ *:(3, 0) , #:(3,2) ]
    dis = [ (3, 1), (0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2), (3, 0), (3, 2) ]
    # 현재 왼쪽 손가락과 오른쪽 손가락의 위치를 저장한다.
    now_lefthand, now_righthand = 10, 11
    
    for num in numbers:
        if num in (1, 4, 7): # 1, 4, 7에 해당하는 키패드는 왼쪽 손가락으로 클릭한다.
            result += 'L'
            now_lefthand = num
        elif num in (3, 6, 9): # 3, 6, 9에 해당하는 키패드는 오른쪽 손가락으로 클릭한다.
            result += 'R'
            now_righthand = num
        
        else: # 2, 4, 8, 0의 경우는 키패드와 현재 왼쪽손가락, 오른쪽 손가락과의 거리를 계산해서 비교한다.
            dis_lefthand = abs((dis[now_lefthand][0] - dis[num][0])) + abs((dis[now_lefthand][1] - dis[num][1]))
            dis_righthand = abs((dis[now_righthand][0] - dis[num][0])) + abs((dis[now_righthand][1] - dis[num][1]))
            
            if dis_lefthand < dis_righthand: # 현재 키패드에 왼쪽 손가락이 가까운 경우
                result += 'L'
                now_lefthand = num
            elif dis_lefthand > dis_righthand: # 현재 키패드에 오른쪽 손가락이 가까운 경우
                result += 'R'
                now_righthand = num
            else: # 현재 키패드와 왼쪽, 오른쪽 손가락 간의 거리가 같다면 인자로 받은 hand의 값으로 판별한다.
                if hand == 'left':
                    result += 'L'
                    now_lefthand = num
                else:
                    result += 'R'
                    now_righthand = num
    
    return result

느낀점

같은 문제라도 다양하게 풀어보려는 노력을 해야겠다.

profile
항상 궁금해하고 공부하고 기록하자.

0개의 댓글