KEEP GOING

[python] 프로그래머스 67256번 : 키패드 누르기 (divmod()) 본문

code review/implementation

[python] 프로그래머스 67256번 : 키패드 누르기 (divmod())

jmHan 2022. 3. 17. 15:33
반응형

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 position(Num):
    global keypad
    for i in range(4):
        for j in range(3):
            if keypad[i][j] == Num:
                return [i, j]
            
def distance(s_x, s_y, t_x, t_y):
    D = abs(s_x - t_x) + abs(s_y - t_y)
    return D

def solution(numbers, hand):
    global keypad
    keypad = [[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9],
              [-1, 0, -1]]
    
    left_x, left_y = 3, 0
    right_x, right_y = 3, 2 
    answer = ''
    for number in numbers:
        # 왼손이 움직여야 할 경우
        if number == 1 or number == 4 or number == 7:
            x, y = position(number)
            left_x, left_y = x, y
            answer += 'L'
        # 오른손이 움직여야 할 경우 
        elif number == 3 or number == 6 or number == 9:
            x, y = position(number)
            right_x, right_y = x, y
            answer += 'R'
        else:
            x, y = position(number)
            # 각거리 distance 비교후 짧은 쪽이 move
            ld = distance(left_x, left_y, x, y)
            rd = distance(right_x, right_y, x, y)
            if ld < rd:
                left_x, left_y = x, y
                answer += 'L'
            elif ld > rd:
                right_x, right_y = x, y
                answer += 'R'
            else:
                if hand == 'left':
                    left_x, left_y = x, y
                    answer += 'L'
                else:
                    right_x, right_y = x, y
                    answer += 'R'   
    return answer

[코드 개선]

if number == 1 or number == 4 or number == 7:

-> if number in [1,4,7]

 

맨하탄 거리를 구하는 함수 distance

-> left, right = 10, 12 

-> number = *일때 각각 11으로 대체 (이렇게 하면 위아래 간 간격이 3 차이 좌우로는 1 차이) 

-> 번호와 주어진 숫자의 절댓값을 3으로 나눈 몫과 나머지의 합으로 거리를 구할 수 있음

 

1 2 3

4 5 6

7 8 9

10 11 12

 

4와 9의 거리 >  abs(4-9) = 5 

                       divmod(5, 3) = 1, 2  (3은 gap 차이)

                       맨하탄 거리 = 1 + 2 = 3

def distance(s_x, s_y, t_x, t_y):
    D = abs(s_x - t_x) + abs(s_y - t_y)
    return D

def solution(numbers, hand):
    left, right = 10, 12
    answer = ''
    for number in numbers:
        number = 11 if number == 0 else number
        # 왼손이 움직여야 할 경우
        if number in [1,4,7]:
            left = number
            answer += 'L'
        # 오른손이 움직여야 할 경우 
        elif number in [3,6,9]:
            right = number
            answer += 'R'
        else:
            # 각거리 distance 비교후 짧은 쪽이 move
            ld = sum(divmod(abs(left-number), 3))
            rd = sum(divmod(abs(right-number), 3))
            if ld < rd:
                left = number
                answer += 'L'
            elif ld > rd:
                right = number
                answer += 'R'
            else: # 거리가 같다면 왼손잡이인지 오른손잡이인지 확인
                if hand == 'left':
                    left = number
                    answer += 'L'
                else:
                    right = number
                    answer += 'R'  
    return answer

주어진 개념을 응용한 경우

 

1   2   3   4   5

 7   8   9  10

11 12 13 14 15

16 17 18 19 20

 

7과 14의 맨하탄 거리 : abs(14 - 7) = 7

                                 divmod(7, 5) = 1, 2 (5은 gap 차이)

                                 두 숫자의 맨하탄 거리 = 1+2 = 3

[에러 발생]

# 시간을 잡아 먹은이유
TypeError: 'int' object is not subscriptable
# 인덱스를 갖지 않는 값에 인덱스로 접근해서
# 이중배열을 만들 때 [] 안에 [] 만드는거 실수함  

 

반응형
Comments