프로그래머스 1단계 "키패드 누르기"

sanha_OvO·2021년 6월 15일
0

Algorithm

목록 보기
53/84

문제

프로그래머스 1단계 키패드 누르기


풀이


문제 자체는 쉬웠지만 푸는 시간은 생각보다 오래걸렸던 구현 문제였다.
기본적으로는 numbers 리스트의 순서대로 반복하며 왼손이 누를 경우 answer 문자열에 'L', 오른손이 누를 경우 'R'을 추가해 주고 누른 손의 위치를 저장해 주면 된다.

물론 해당 반복의 numbers값(k)이 1, 4, 7인 경우는 왼손, 3, 6, 9인 경우는 오른손이니 단순하지만 2, 5, 8, 0일 경우에는 전에 움직였던 손의 위치를 고려하여 생각하여야 한다.

위 아래로 움직일 경우 -3, +3이 되고 좌우로 움직일 땐 -1, +1이 되므로 절대값을 이용하여 숫자간의 거리를 계산할 수 있다.
즉, 두 수의 차이의 절대값을 3으로 나눈 몫과 나머지를 더하면 두수의 거리를 알 수 있다.

만약 왼손과 오른손의 거리가 같다면 hand를 이용하여 왼손이 누를지 오른손이 누를지 결정하면 된다.

또 간과하면 안될 것이 0의 위치인데, 키패드의 위치상 0은 9보다 +2이므로 11로 두고 계산을 하여야 한다.
이와 마찬가지로 처음 손의 위치를 *은 10, #은 12로 두고 시작하여야 한다.


Python 코드

import sys
input = sys.stdin.readline

def solution(numbers, hand):
  crt = {'left':10, 'right':12}
  answer = ''
  for k in numbers:
    if k == 0:
      k = 11
    if k == 1 or k == 4 or k == 7:
      answer += 'L'
      crt['left'] = k
    elif k == 3 or k == 6 or k == 9:
      answer += 'R'
      crt['right'] = k
    else:
      left_dis = abs(k-crt['left'])//3 + abs(k-crt['left'])%3
      right_dis = abs(k-crt['right'])//3 + abs(k-crt['right'])%3
      if left_dis > right_dis:
        answer += 'R'
        crt['right'] = k
      elif left_dis < right_dis:
        answer += 'L'
        crt['left'] = k
      else:
        if hand == 'left':
          answer += 'L'
          crt['left'] = k
        else:
          answer += 'R'
          crt['right'] = k
  
  return answer
profile
Web Developer / Composer

0개의 댓글