코딩테스트 연습 - 키패드 누르기

Gyuhan Park·2021년 7월 20일
0

코딩테스트 정복

목록 보기
13/47

코딩테스트 연습 - 키패드 누르기

키패드를 누르는 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 반환하라.

# 오류코드

거리를 어떻게 구할 지가 문제다. 그냥 숫자끼리 빼는건 손가락이 가운데 있을 경우 오류가 발생한다.

def solution(numbers, hand):
    answer = ''
    left, right = 10, 12
    
    for i in range(len(numbers)):
        if numbers[i] == 1 or numbers[i] == 4 or numbers[i] == 7:
            left = numbers[i]
            answer += "L"
        elif numbers[i] == 3 or numbers[i] == 6 or numbers[i] == 9:
            right = numbers[i]
            answer += "R"
        # 가운데 2,5,8,0 누를 경우 가까운 손가락 / 거리가 같으면 주손가락
        else: 
            if abs(left-numbers[i]) > abs(right-numbers[i]):
                right = numbers[i]
                answer += "R"
            elif abs(left-numbers[i]) < abs(right-numbers[i]):
                left = numbers[i]
                answer += "L"                
            if abs(left-numbers[i]) == abs(right-numbers[i]):
                if hand == "left":
                    left = numbers[i]
                    answer += "L"            
                else:
                    right = numbers[i]
                    answer += "R"                    
        
    print(answer)
    
    
    return answer

숫자랑 숫자를 빼지 않고 각 숫자를 좌표평면에 놓고 좌표를 설정하여 두 점 사이의 거리를 구했다.
합계: 60.0 / 100.0 : 테스트 13~20 실패

import math

def solution(numbers, hand):
    answer = ''
    left, right = (0,0), (2,0)
    # 0~9의 좌표
    location = [(1,0), (0,3), (1,3), (2,3), (0,2), (1,2), (2,2), (0,1), (1,1), (2,1)]
    for i in range(len(numbers)):
        if numbers[i] == 1 or numbers[i] == 4 or numbers[i] == 7:
            left = location[numbers[i]]
            answer += "L"
        elif numbers[i] == 3 or numbers[i] == 6 or numbers[i] == 9:
            right = location[numbers[i]]
            answer += "R"
        else:
            l_distance = math.sqrt(math.pow(left[0]-location[numbers[i]][0], 2) + 
            math.pow(left[1]-location[numbers[i]][1], 2))
            r_distance = math.sqrt(math.pow(right[0]-location[numbers[i]][0], 2) + 
            math.pow(right[1]-location[numbers[i]][1], 2))
            
            if l_distance < r_distance:
                left = location[numbers[i]]
                answer += "L"
            elif l_distance > r_distance:
                right = location[numbers[i]]
                answer += "R"                
            else:
                if hand == "left":
                    left = location[numbers[i]]
                    answer += "L"
                else:
                    right = location[numbers[i]]
                    answer += "R"
        

    
    
    return answer

# 정답코드

문제를 천천히 다시 읽어보니 두 점 사이의 거리를 구하는 문제인줄 알았지만 아니였다. 키패드에서의 이동은 상하좌우 한칸당 1이다. 그래서 좌표평면으로 대각선의 길이를 구하는 것이 아니라 (x좌표차)+(y좌표차)가 정답이다.
추가적으로 조건문에서 조건을 나열하는 것보다 리스트를 만들어 해당하는 숫자나 문자만 저장해 if ~ in ~ 을 사용하는 것이 깔끔한 것 같다.

def solution(numbers, hand):
    answer = ''
    left, right = (0,0), (2,0)
    left_key = [1, 4, 7]
    right_key = [3, 6, 9]
    # 0~9의 좌표
    location = [(1,0), (0,3), (1,3), (2,3), (0,2), (1,2), (2,2), (0,1), (1,1), (2,1)]
    
    for i in range(len(numbers)):
        if numbers[i] in left_key:
            left = location[numbers[i]]
            answer += "L"
        elif numbers[i] in right_key:
            right = location[numbers[i]]
            answer += "R"
        else:
            l_distance = abs(left[0]-location[numbers[i]][0]) + 
            abs(left[1]-location[numbers[i]][1])
            r_distance = abs(right[0]-location[numbers[i]][0]) + 
            abs(right[1]-location[numbers[i]][1])
            
            if l_distance < r_distance:
                left = location[numbers[i]]
                answer += "L"
            elif l_distance > r_distance:
                right = location[numbers[i]]
                answer += "R"                
            else:
                if hand == "left":
                    left = location[numbers[i]]
                    answer += "L"
                else:
                    right = location[numbers[i]]
                    answer += "R"
        

    
    
    return answer
profile
단단한 프론트엔드 개발자가 되고 싶은

0개의 댓글