[프로그래머스] 카카오 - 키패드 누르기(Python3), 좌표 거리 구하기

Song_Song·2021년 9월 6일
0
post-custom-banner

문제

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

휴대폰 숫자 패드에서 숫자 버튼과 버튼의 거리를 구하는 것이 핵심인 문제이다.
많은 고민을 하다가 다른 사람의 풀이를 참고하며 풀어보았다.

나의 첫 번째 풀이

핵심은 가운데 열의 버튼들이다. 가운데 버튼을 누를 때에는 더 가까운 쪽의 손으로 클릭해야 하기 때문이다.
가운데 열의 버튼을 기준으로

한 칸 차이는 절대값 1 or 3
두 칸 차이는 절대값 2 or 4
세 칸 차이는 절대값 5 or 7 이다.

-7 -3 -5
-4 ↖ ↑ ↗ -2
-1 ← → +1
+2 ↙ ↓ ↘ +4
+5 +3 +7

이는 숫자 버튼끼리의 거리차이 절대값//3 의 (몫) + 거리 차이 절대값 %3 (나누기)의 합 = 거리
라는 공식을 만들어 낼 수 있다.
이를 활용한 코드는 아래와 같다.

def solution(numbers, hand):
    answer = ''
   
    l_hand = 10
    r_hand = 12
       
    for num in numbers:
        if num == 1 or num == 4 or num == 7: #왼손
            l_hand = num
            answer += "L"
        elif num == 3 or num == 6 or num == 9: #오른손
            r_hand = num
            answer += "R"
        else:    
            if num == 0:    
                num = 11
        
            left_point = abs(num - l_hand)
            right_point = abs(num - r_hand)
        
            left_distance = sum(list(map(int, [left_point//3, left_point%3])))
            right_distance = sum(list(map(int, [right_point//3, right_point%3])))
       
            if left_distance == right_distance: # 거리 같은 때 -> 주 손
                if hand == "left":
                    l_hand = num
                    answer += "L"
                else:
                    r_hand = num
                    answer += "R"
            else: # 거리 다를 때 -> 가까운 손
                if left_distance < right_distance:
                    l_hand = num
                    answer += "L"
                else:
                    r_hand = num
                    answer += "R"
    return answer

나의 두 번째 풀이

두 번째 방법은 각 키패드 별로 임의의 좌표를 설정해 준 후에 좌표간의 거리를 구하는 방법이다.
key라는 딕셔너리에 튜플 형태로 좌표를 설정 해준다. (리스트로 설정해도 무방) 튜플을 사용하는 이유는 보통 튜플은 원소의 타입이 같을 때, 그리고 immutable 한 값을 초기화할 때 사용하기 때문이다.

또한, 왼손과 오른 손의 디폴트 좌표를 10과 12로 설정 하였는데, "*", "#"로 사용해도 무관하다.

거리를 구하는 방식은 맨하탄 거리 계산법을 사용하였다. 좌, 우, 상, 하를 각각 1로 사용하기 때문에 유클리드 거리 계산법을 사용하면 문제를 풀 수 없다.

def solution(numbers, hand):
    answer = ''
   
    l_hand = 10
    r_hand = 12
   
    key = {
        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),
        10 : (3, 0), 0 : (3, 1), 12 : (3,2)    
    }
   
    for num in numbers:
        if num == 1 or num == 4 or num == 7:
            l_hand = num
            answer += "L"
        elif num == 3 or num == 6 or num == 9:
            r_hand = num
            answer += "R"
        else:
         
            left_distance = abs(key[num][0] - key[l_hand][0]) + abs(key[num][1] - key[l_hand][1])
            right_distance = abs(key[num][0] - key[r_hand][0]) + abs(key[num][1] - key[r_hand][1])
               
            if left_distance == right_distance:
                if hand == "left":
                    l_hand = num
                    answer += "L"
                else:
                    r_hand = num
                    answer += "R"
            else:
                if left_distance < right_distance:
                    l_hand = num
                    answer += "L"
                else:
                    r_hand = num
                    answer += "R"
                  
    return answer    



유클리드 거리 측정법 & 맨하탄 거리 측정법

profile
성장을 위한 정리 블로그
post-custom-banner

0개의 댓글