Cute Running Puppy

algorithm/Programmers

[python]level1. 키패드 누르기

R.silver 2022. 2. 8. 11:21
반응형

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

 

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

[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):
    answer = ''
    key = [[1, 2, 3], [4, 5, 6], [7, 8, 9], ['*', 0, '#']]
    left = [1, 4, 7, '*']
    right = [3, 6, 9, "#"]
    last_left = '*' #왼손의 마지막 위치 저장
    last_right = '#'
    for i in numbers:
        if(i in left):
           answer = answer + "L"
           last_left = i
        elif(i in right):
            answer = answer + "R"
            last_right = i
        else:
            #마지막 왼손의 위치와 i 위치를 비교
            #마지막 오른손의 위치와 i 위치를 비교
            #둘의 차이 중 작은 값 저장하고 손의 위치를 변경

            # 계산한 거리차 담는 곳
            l_dis = 99
            r_dis = 99

            for k in range(4):
                for j in range(3):
                    if key[k][j] == i:

                        # 왼쪽 손의 좌표
                        for l_row in range(4):
                            for l_col in range(3):
                                if (key[l_row][l_col] == last_left):
                                    l_dis = abs(k-l_row) + abs(j-l_col)


                        # 오른 손의 좌표
                        for r_row in range(4):
                            for r_col in range(3):
                                if (key[r_row][r_col] == last_right):
                                    r_dis = abs(k-r_row) + abs(j-r_col)

                        if(l_dis < r_dis):
                            answer = answer + "L"
                            last_left = i
                        elif(l_dis > r_dis):
                            answer = answer + "R"
                            last_right = i
                        else:
                            if(hand == "left"):
                                answer = answer + "L"
                                last_left = i
                            else:
                                answer = answer + "R"
                                last_right = i

    return answer

 

키패드의 위치를 이차원 배열로 생각하면 어렵지 않게 해결할 수 있다. 

for문들의 위치에 주의해야 하며

거리 값을 계산할 때 절댓값 함수를 씌우는 곳에 주의해야 한다. 

 

좋아요를 가장 많이 받은 코드에는 key의 위치를 이차원 배열이 아닌 딕셔너리를 활용하였다. 

 

key_dict = {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)}

 

딕셔너리를 이런 방식으로도 작성하여 활용할 수 있다니

잊지 않고 다음 번 유사한 문제가 나왔을 때 적용할 수 있도록 해야겠다. 

반응형