알고리즘

[프로그래머스 Lv1 - 2020 카카오 인턴십] 키패드 누르기 (Python)

lwkejpf 2022. 6. 30. 15:39

 

 


 

def solution(numbers, hand):
    answer = ''
    left = '*'
    right = '#'
    
    for num in numbers :
        if num % 3 == 1 :
            answer += 'L'
            left = num
            
        elif num != 0 and num % 3 == 0 :
            answer += 'R'
            right = num
            
        else :
            temp = [[i, i+1, i+2] for i in [1, 4, 7]]
            temp2 = []
            temp.append(['*', 0, '#'])
            
            if num >= 1 and num <= 9 :
                numX = temp[(num-1)//3].index(num)
                numY = (num-1) // 3
                
            else :
                numX = 1
                numY = 3
                
            for val in [left, right] :
                if val in ['*', 0, '#'] :
                    valX = temp[3].index(val)
                    valY = 3
                    
                else :
                    valX = temp[(val-1)//3].index(val)
                    valY = (val-1) // 3
                
                dist = abs(valX - numX) + abs(valY - numY)
                temp2.append(dist)
                
            if temp2[0] < temp2[1] :
                answer += 'L'
                left = num
                
            elif temp2[1] < temp2[0] :
                answer += 'R'
                right = num
                
            else :
                answer += hand[0].upper()
                if hand == "left" :
                    left = num
                else :
                    right = num
    return answer

 

쉬워보였는데 은근 헷갈려서 계속 헤맸다 .. 1시간 걸림 ㅠ

 

키패드 번호판 그대로 2차원 배열 temp 만들 때

 

temp = [[i, i+1, i+2] for i in range([1, 4, 7])] (x)

temp = [[i, i+1, i+2] for i in [1, 4, 7]] (o)

 

 

그리고 키패드 가운데 있는 숫자들이면

왼손/오른손 각각 거리 계산해줘서 더 짧은 거리로 가야 해서

편하게 계산하려고 최상단 왼쪽 (0, 0) 로 두고 좌표 설정해줬다

 

근데 여기서 3칸씩 있다고 아무 생각없이 

numX = temp[num // 3].index(num)
numY = num // 3

 

라고 쓰면? 당연히 틀림

예를 들어 키패드 3은 맨위 0번째 행에 있는데 위 식대로면 1이 나오기 때문,,

 

numX = temp[(num-1) // 3].index(num)
numY = (num-1) // 3

 

처럼 (num - 1) // 3 라고 해줘야 한다.....

 

그리고 현재 왼손/오른손 위치 (변수 left/right) 갱신해주는 거 자꾸 빼먹어서 헤멨다

정신 빠짝 차려야지 ^_^