LV1. [2020 KACA実習]キーボードを押す

9826 ワード

[Kaka実習生]キーボードを押す


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

問題の説明



この電話のキーボードに数字を入力したいのですが、左手と右手の親指しか使いません.
最初の左手親指は*右手親指は#キーボードの位置から始まり、ルールは以下の通りです.
  • 親指は上下左右4方向にしか移動できず、キーボードを動かすセル距離は1です.
  • 左側の列の3つの数字1、4、7を入力する場合は、左手親指を使用してください.
  • 右側の列の3つの数字3、6、9を入力する場合は、右手親指を使用してください.
  • の4つの数字2、5、8、0を入力する場合は、2つの親指の現在のキーボード位置に近い親指を使用します.
    2つの親指の距離が等しい場合は、右利きは右手親指、左利きは左手親指を使用します.
  • せいげんじょうけん

  • numbers配列のサイズは1000より大きい.
  • numbers配列要素の値は0または9以下の整数です.
  • 手は「左」または「右」です.
  • 左手親指を使用する場合は「L」、右手親指を使用する場合は「R」と順番に接続され、文字列形式で返されます.
  • I/O例



    コード#コード#

    import math
    
    #손가락과 입력숫자의 거리를 구해주는 함수
    def getDistance(num, finger):
        return abs(num[0]-finger[0]) + abs(num[1]-finger[1])
        
        
    def solution(numbers, hand):
        answer = ''
        
        #오른손잡이인지 왼손잡이인지 간편하게 비교하기위해.
        hand = hand[0].upper()
        
        #손의 처음위치를 정수로 치환한다.
        left = 10
        right = 12
        
        #각 숫자의 좌표를 Dic형으로 입력하고, 예외 숫자를 초기화해준다.
        dic = {}
        dic[0] = [4, 2]
        dic[10] = [4, 1]
        dic[12] = [4, 3]
        
         # 2중 반복문이지만, 1~9까지기때문에 O(9)이라고 할 수 있다.
        for i in range(1, 4):
            for j in range(1, 4):
                dic[(i-1)*3+j] = [i, j]
    
                
        for num in numbers: # O(N)
            #기본 정해진 왼손과 오른손의 위치일 때
            if(num % 3 == 1):
                answer += 'L'
                left = num
            elif(num % 3 == 0 and num > 0):
                answer += 'R'
                right = num
                
            #2, 5, 8, 0과 같은 가운데 위치일 때
            else:
                #왼손과 오른손의 입력숫자와의 거리 비교 후 가까운 손으로 입력한다.
                left_distance = getDistance(dic[num], dic[left])
                right_distance = getDistance(dic[num], dic[right])
                
                if(left_distance < right_distance):
                    answer += 'L'
                    left = num
                elif(left_distance > right_distance):
                    answer += 'R'
                    right = num
                else:
                    if(hand == 'L'):
                        answer += 'L'
                        left = num
                    else:
                        answer += 'R'
                        right = num
    
        return answer