[프로그래머스 1단계] 2020 카카오 인턴십 - 키패드 누르기

파이톨치·2022년 1월 20일
2
post-thumbnail

문제 설명

다음과 같이 키패드가 있다고 생각해보자.
우리는 왼손과 오른손의 엄지 손락락을 사용해서 키패드를 눌러야 하는데 이때 손가락을 최대한 덜 쓰고 움직이게 만들어야 한다. 세부적인 규칙은 다음과 같다.

  1. 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
  2. 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용합니다.
  3. 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용합니다.
  4. 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.
  5. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.

코드

    left = [1, 4, 7, 10]
    right = [3, 6, 9, 12]
    left_finger = 10
    right_finger = 12

우선 다음과 같이 4개의 변수를 만들어 주었다. left는 왼쪽에 있는 키패드를 의미하고 right는 오른쪽에 있는 키패드이다. 손가락을 최소한으로 움직이게 하기 위해서 지금 내 손가락이 어디에 있는지 알아야 하기 때문에 left_finger와 right_finger를 만들어 주었다.

# numbers = [1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5]

    for i in numbers:
      if i in left:
        answer = answer + "L"
        left_finger = i
      elif i in right:
        answer  = answer + "R"
        right_finger = i

numbers는 프로그래머스에서 자동으로 입력해주는데 위의 값은 테스트 값이다. 내가 누를 키패드를 의미한다.
for문을 활용해서 numbers에 있는 숫자를 하나씩 가져온다. 만약 왼쪽 키패드에 있으면 왼손을 쓰고 오른쪽에 있으면 오른손을 쓴다. 조금 복잡해 지는 경우는 가운데에 있을 경우이다.

      else:
        if i == 0:
          i = 11
        move_left = (abs(i-left_finger)%3) + (abs(i-left_finger)//3)
        move_right = (abs(i-right_finger)%3) + (abs(i-right_finger)//3)

        if move_left < move_right:
          answer = answer + "L"
          left_finger = i
        elif move_right < move_left:
          answer = answer + "R"
          right_finger = i
        else:
          if hand == "right":
            answer = answer + "R"
            right_finger = i
          if hand == "left":
            answer = answer + "L"
            left_finger = i

별 것도 아닌데 엄청 길다. 우리가 고려해야 하는 것은 2가지 이다.

  1. 어느 손가락이 더 가까운지
  2. 거리가 같으면 오른손잡인지 왼손잡인지

때문에 거리를 재기 위해서 나는 약간 특이한 방법을 사용하였다. 우선 키패드를 1~12까지로 만들고 현재 키패드와 누를 키패드의 값의 차를 계산해준다. 그러고 그것을 3으로 나눈 몫과 나머지가 이동 횟수이다. 수학적으로 왜 그런지는 나는 수학과가 아니라 증명할 수는 없지만 몇번 해보면 내 말이 맞다는 것을 알 수 있을 것이다. 거리를 계산 했으니 첫 번째 사항은 끝냈다 2번째는 간단하다 그냥 hand가 "left"인지 "right"인지 확인만 해주면 된다. 그러고 나서 지금 내가 누른 키보드의 위치가 현재 손가락의 위치로 업데이트 해주면 된다.

다른 분들의 풀이를 보면 더 직과적이지만 나는 이게 코드가 더 깔끔한 것 같아서 좋다. 취향 차이이니 좀 더 직관적인 코드를 원하면 정답을 맞추고 다른 분들의 코드를 구경하면 된다.

전체 코드

def solution(numbers, hand):
    answer = ''
    left = [1, 4, 7, 10]
    right = [3, 6, 9, 12]
    left_finger = 10
    right_finger = 12

    for i in numbers:
      if i in left:
        answer = answer + "L"
        left_finger = i
      elif i in right:
        answer  = answer + "R"
        right_finger = i
      else:
        if i == 0:
          i = 11
        move_left = (abs(i-left_finger)%3) + (abs(i-left_finger)//3)
        move_right = (abs(i-right_finger)%3) + (abs(i-right_finger)//3)

        if move_left < move_right:
          answer = answer + "L"
          left_finger = i
        elif move_right < move_left:
          answer = answer + "R"
          right_finger = i
        else:
          if hand == "right":
            answer = answer + "R"
            right_finger = i
          if hand == "left":
            answer = answer + "L"
            left_finger = i

    return answer
solution([1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5],"right")
#result : "LRLLLRLLRRL"

이 문제로 고민을 하고 있을 사람들에게 도움이 됐기를 바라면서 블로그를 마칩니다.

문제 링크

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

profile
안알랴줌

0개의 댓글