알고리즘/문제풀이

[Python] Programmers 키패드 누르기

정찡이 2021. 9. 4. 15:37
728x90

1. 문제 링크

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


2. 문제 요약

 


3. 아이디어 정리

  1. 번호가 왼쪽 방향인 경우 왼쪽 손
  2. 번호가 오른쪽 방향인 경우 오른쪽 손
  3. 중간인 경우, 왼손 오른손 계산을 진행한다.
  • 거리 계산하는 방식은 아래와 같다. (왼손 거리 구하는 경우 예시)
    • 손이 가운데 있는 경우
  • 손이 왼쪽 라인에 있는 경우 , 목표 번호 - 1을 진행하여 왼쪽 라인으로 이동한다. 현재 왼손 - (목표 번호 - 1) // 3을 하여 거리를 구한다.


4. 문제 풀이

4-1. 내 풀이

def solution(numbers, hand):
    answer = ''
    left = 10    #  *
    right = 12   #  #
    for num in numbers:
        if num in [1, 4, 7]:    # 1. 왼쪽 방향에 있는 경우
            answer += 'L'
            left = num
        elif num in [3, 6, 9]:  # 2. 오른쪽 방향에 있는 경우
            answer += 'R'
            right = num
        else:                   # 3. 중간에 있는 경우
            if num == 0: num = 11    # 0인 경우 11로 대체
            # 3-1. left에서 거리 구하기
            if left in [2, 5, 8, 11]:       # 현재 손이 가운데 있는 경우
                left_dis = abs(num - left) // 3
            else:                           # 현재 손이 왼쪽에 있는 경우, 현재 수에서 - 1 시켜 왼쪽 키패드로 이동 후 계산
                left_num = num - 1
                left_dis = abs(left - left_num) // 3 + 1
            # 3-2. right에서 거리 구하기
            if right in [2, 5, 8, 11]:
                right_dis = abs(num - right) // 3
            else:
                right_num = num + 1
                right_dis = abs(right - right_num) // 3 + 1
            # 3-3. 왼쪽, 오른쪽 거리 비교하여 값 넣기
            if left_dis < right_dis:
                answer += 'L'
                left = num
            elif left_dis > right_dis:
                answer += 'R'
                right = num
            else:         # 같은 경우 hand 따라 다르게 세팅
                if hand == 'right':
                    answer += 'R'
                    right = num
                else:
                    answer += 'L'
                    left = num
    return answer

5. 결론

  • 가운데 키패드를 눌러야하는 경우 거리를 구하는 것이 복잡했던 문제
반응형