본문 바로가기

프로그래머스 알고리즘 문제/Level 1

프로그래머스 Level 1 - 키패드 누르기

내 정답:

 

def solution(numbers, hand):
    keypad = [
        [1,2,3], # [0][0], [0][1], [0][2]
        [4,5,6], # [1][0], [1][1], [1][2]
        [7,8,9], # ... 움직여야 할 거리는 abs(i1-i2)+abs(j1-j2) 이다.
        [98,0,99]
    ]
    def find_i_j(num):
        for i in range(4):
            for j in range(3):
                if keypad[i][j] == num:
                    return i,j
    def dists_l_r(i_n,i_l,i_r,j_n,j_l,j_r):
        return abs(i_n-i_l)+abs(j_n-j_l), abs(i_n-i_r)+abs(j_n-j_r)

    answer = ''
    i_n, j_n, i_l, j_l, i_r, j_r = 0,0,3,0,3,2
    for num in numbers:
        if num in [1,4,7]:
            answer += 'L'
            i_l, j_l = find_i_j(num)
        elif num in [3,6,9]:
            answer += 'R'
            i_r, j_r = find_i_j(num)
        else:
            i_n, j_n = find_i_j(num)
            ldist, rdist = dists_l_r(i_n,i_l,i_r,j_n,j_l,j_r)
            if ldist == rdist:
                if hand == 'left':
                    answer += 'L'
                    i_l, j_l = find_i_j(num)
                else:
                    answer += 'R'
                    i_r, j_r = find_i_j(num)
            elif ldist > rdist: # 오른손이 더 가까울 때 (덜 멀때)
                answer += 'R'
                i_r, j_r = find_i_j(num)
            else:
                answer += 'L'
                i_l, j_l = find_i_j(num)
    return answer

 

다른 사람들의 정답:

 

def solution(numbers, hand):
    l = 10
    r = 11
    answer = ""
    p = [[0, 4, 3, 4, 3, 2, 3, 2, 1, 2],
         [4, 0, 1, 2, 0, 2, 3, 0, 3, 4],
         [3, 1, 0, 1, 2, 1, 2, 3, 2, 3],
         [4, 2, 1, 0, 3, 2, 1, 4, 3, 2],
         [3, 0, 2, 3, 0, 1, 2, 0, 2, 3],
         [2, 2, 1, 2, 1, 0, 1, 2, 1, 2],
         [3, 3, 2, 1, 2, 1, 0, 3, 2, 1],
         [2, 0, 3, 4, 0, 2, 3, 0, 1, 2],
         [1, 3, 2, 3, 2, 1, 2, 1, 0, 1],
         [2, 4, 3, 2, 3, 2, 1, 2, 1, 0],
         [1, 0, 4, 5, 0, 3, 4, 0, 2, 3],
         [1, 5, 4, 0, 4, 3, 0, 3, 2, 0]]
    for i in numbers:
        if i in [1, 4, 7]:
            l = i
            answer += "L"
        elif i in [3, 6, 9]:
            r = i
            answer += "R"
        else:
            if p[l][i] < p[r][i]:
                l = i
                answer += "L"
            elif p[l][i] > p[r][i]:
                r = i
                answer += "R"
            elif hand == "left":
                l = i
                answer += "L"
            else:
                r = i
                answer += "R"
    return answer