Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total



GitHub Contribution
Loading data ...
관리 메뉴

초보 개발자의 일기

Programmers - 키패드 누르기 본문

열공일기/코딩연습

Programmers - 키패드 누르기

Da다 2021. 9. 6. 14:16

어려웠던 문제...! 1레벨 문제중에 가장 오래걸렸다. 풀어서 다행이다.


순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인지를 나타내는 문자열 hand가 매개변수로 주어질 때,
각 번호를 누른 엄지손가락이 왼손인지 오른손인지를 연속된 문자열 형태로 나타내는 문제이다.

 

사용한 언어는  Python3 이다.

Manhattan distance를 이용해서 풀었다. 숫자별 좌표(finger)를 설정하고, manhattan 함수를 이용하여 거리를 구하고, 더 가까운 쪽의 손가락으로 키패드를 누른다. 키패드를 누르면 그 자리의 좌표를 손가락 변수(L_finger OR R_finger)에 저장한다.

 

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

[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"

programmers.co.kr

def solution(numbers, hand):
    
    def manhattan(p1, p2):
        d = 0
        for i in range(len(p1)):
            d += abs(p1[i] - p2[i])
        return d
    
    answer = ''
    finger = {1:[0, 0], 4:[1, 0], 7:[2, 0], '*':[3, 0], 2:[0, 1],5:[1, 1],8:[2, 1],0:[3, 1],3:[0, 2],6:[1, 2],9:[2, 2],'#':[3, 2]}
    L_finger = finger['*']; R_finger = finger['#']
    
    for i in numbers:
        if i in (1, 4, 7):
            L_finger = finger[i]
            answer += 'L'
        elif i in (3, 6, 9):
            R_finger = finger[i]
            answer += 'R'
        else:
            if manhattan(finger[i], L_finger) == manhattan(finger[i], R_finger):
                if hand == 'left':
                    L_finger = finger[i]
                    answer += 'L'
                else:
                    R_finger = finger[i]
                    answer += 'R'
            elif manhattan(finger[i], L_finger) > manhattan(finger[i], R_finger):
                R_finger = finger[i]
                answer += 'R'
            else:
                L_finger = finger[i]
                answer += 'L'
    return answer
Comments