[프로그래머스] 스터디

2021.06.20
프로그래머스 스터디 1일차

키패드 누르기

문제

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

처음 30분동안 각자 문제풀기
같이 스터디하는 동생(K)는 10~20분만에 금방 풀었는데 나는 못 풀었다,,

내가 처음 짠 코드는

  • 키패드를 리스트로 keypad에 할당
  • 키패드 숫자와 좌표를 사용하는 과정에서 뇌정지

K가 짠 코드를 설명해주는데

  • keypad에 딕셔너리를 사용
  • 1,4,7과 3,6,9를 리스트로 사용

이 두 가지를 생각 못해서 못풀고 있었다.

K는 이동거리를 상하좌우가 아닌 직선거리로 계산해 제출하는과정에서 실패한 문제가 있었고
각자 20분정도 코드 수정을 했고, 내가 수정한 코드는 다음과 같다.

def solution(numbers, hand):
    # 키패드 정의
    keypad = {1 : (0,0), 2 : (0,1), 3 : (0,2),
             4 : (1,0), 5 : (1,1), 6 : (1,2),
             7 : (2,0), 8 : (2,1), 9 : (2,2),
             "*" : (3,0), 0 : (3,1), "#" : (3,2)}

    # 처음 손가락 위치
    LH = keypad["*"]
    RH = keypad["#"]

    # 왼손, 오른손 숫자
    left = [1, 4, 7]
    right = [3, 6, 9]

    # 답
    answer = ''
    
    # 코드
    for i in numbers:
        if i in left:
            LH = keypad[i]
            answer += "L"
        elif i in right:
            RH = keypad[i]
            answer += "R"
        else:
            # 오른속, 왼손 이동거리
            r_move = abs(RH[0] - keypad[i][0]) + abs(RH[1] - keypad[i][1])
            l_move = abs(LH[0] - keypad[i][0]) + abs(LH[1] - keypad[i][1])
            if r_move > l_move:
                LH = keypad[i]
                answer += "L"
            elif r_move < l_move:
                RH = keypad[i]
                answer += "R"
            else:
                if hand == "left":
                    LH = keypad[i]
                    answer += "L"
                else:
                    RH = keypad[i]
                    answer += "R"                
    return answer

제출하고나니 다른 사람들이 제출한 코드도 볼 수 있었는데
내가 생각한 방식 외 다양한 방식의 코드를 볼 수 있어 좋았다.

생각보다 재밌고 시간도 잘가는게 주 1회 너무 적은 것 같기도 하고,,?

좋은 웹페이지 즐겨찾기