일일구름 IT

프로그래머스 lv.1 [키패드 누르기] 2020 카카오 인턴십 본문

프로그래머스/프로그래머스 lv.1

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

일구름 2022. 7. 6. 21:52

문제 설명

스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.

이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.

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

내 문제 풀이:

import numbers

def solution(numbers, hand):
    answer = ''
    hand = hand[0:1].upper()
    num_dic = {
        1: (0, 3),
        2: (1, 3),
        3: (2, 3),
        4: (0, 2),
        5: (1, 2),
        6: (2, 2),
        7: (0, 1),
        8: (1, 1),
        9: (2, 1),
        '*': (0, 0),
        0: (1, 0),
        '#': (2, 0),
    }
    l_num = [1, 4, 7]
    r_num = [3, 6, 9]
    c_num = [2, 5, 8, 0]
    l_state = '*'
    r_state = '#'

    for i in numbers:
        if i in l_num:
            l_state = i
            answer = answer + 'L'
        elif i in r_num:
            r_state = i
            answer = answer + 'R'
        else:
            l_len = abs(num_dic[l_state][0] - num_dic[i][0]) + abs(num_dic[l_state][1] - num_dic[i][1])
            r_len = abs(num_dic[r_state][0] - num_dic[i][0]) + abs(num_dic[r_state][1] - num_dic[i][1])
            if l_len < r_len:
                l_state = i
                answer = answer + 'L'
            elif l_len > r_len:
                r_state = i
                answer = answer + 'R'
            else:
                if hand == 'L' : l_state = i
                else : r_state = i
                answer = answer + hand

    return answer
  • hand[0:1].upper()을 이용해 입력 값을 R 또는 L로 바꾸어줌
  • num_dic에서 key를 키패드, value를 좌표로 설정
  • *를 (0,0)으로 키패드를 좌표 설정해줌
  • r_state, l_state에 현재 손가락의 위치를 저장해줌
  • 눌러야 할 숫자가 2, 5, 8, 0일 때만 좌표를 이용해 왼손과 오른손 중 어떤 손이 더 가까운지 계산

 

처음에 문제를 잘못읽어 대각선 이동이 가능한줄 알고 숫자의 차이에 따른 거리 순위를 구해 배열을 만들어 문제를 풀었었다.

0은 11로, *와 #은 10, 12로 바꾸었다.

0순위. 0

1순위. 1, 3

2순위. 2, 4

3순위. 6

4순위. 5, 7

5순위. 9

6순위. 10, 8

[0, 1, 2, 1, 2, 4, 3, 4, 6, 5, 6] -> 인덱스 : 숫자 차, 요소 : 거리 순위

 

다음부터는 문제를 더 잘 읽고 풀기로 ..!

코딩 테스트중에 문제를 잘못읽어 처음부터 다시 푼다고 생각하면 소름이 돋는다..