Python/Algorithm

[프로그래머스] 키패드 누르기 - Python

언킴 2023. 8. 24. 20:59
반응형

이번 문제는 2020년 카카오 인턴 코딩 테스트에 나온 문제다.

 

num2key는 번호를 누르면 해당 좌표로 변환하는 코드를 의미한다. 1~9까지는 수식으로 정의하였고, 0의 경우 (3,1) 좌표를 리턴하는 형태로 지정했다. 

 

[1, 4, 7]에 해당하는 키패드는 왼손으로 먼저 클릭하고, [3, 6, 9]에 해당하는 키패드는 오른손으로 먼저 클릭해야 하기 때문에, [2, 5, 8, 0]에 해당하는 값만 잘 설정하면 된다.

 

[2, 5, 8, 0]에서는 왼손과 오른손의 현재 위치에 따라 달리 클릭되기 때문에 클릭될 때마다 좌표값을 받아서 왼손 혹은 오른손의 좌표를 기억하고, 만약 같은 경우 두 값의 차이를 바탕으로 어느 손으로 클릭할 지 처리할 수 있다. 

 

만약 두 값의 차이가 같다면, 왼손 잡이인지 오른손 잡이인지를 보고 판단할 수 있다. 위 설명을 코드로 작성하면 아래와 같다.

 

def num2key(num):
    '''
    input:
    	number
    output:
    	coordinate
    '''
    if num == 0:
        return (3, 1)
    col = num % 3 - 1 if num % 3 != 0 else 2
    row = num // 3 if num % 3 != 0 else num // 3 - 1
    return row, col
    
def solution(numbers, hand):
    l_row, l_col = 3, 0
    r_row, r_col = 3, 2
    answers = ''
    
    for num in numbers:
        row, col = num2key(num)
        
        if num in [1, 4, 7]:
            answers += 'L'
            l_row = row
            l_col = col

        elif num in [3, 6, 9]:
            answers += 'R'
            r_row = row
            r_col = col
            
        else:
            # if num in [2, 5, 8, 0], then calculate distance about the left or right hand
            l_v = abs(l_row - row) + abs(l_col - col)
            r_v = abs(r_row - row) + abs(r_col - col)
            
            if r_v > l_v:
                answers += 'L'
                l_row = row 
                l_col = col
            
            elif r_v < l_v:
                answers += 'R'
                r_row = row 
                r_col = col 

            else:
                if hand == 'right':
                    r_row = row
                    r_col = col
                    answers += 'R'

                else:
                    l_row = row
                    l_col = col 
                    answers += 'L'
        
    return answers