[알고리즘] 프로그래머스 - 키패드 누르기

June·2021년 3월 3일
0

알고리즘

목록 보기
108/260

2020 카카오 인턴십 - 키패드 누르기

내 풀이

def get_dist(cur_pos, num):
    cur_row, cur_col = (cur_pos-1)//3, (cur_pos-1)%3
    target_row, target_col = (num-1) //3, (num-1) % 3
    return abs(cur_row - target_row) + abs(cur_col - target_col)


def solution(numbers, hand):
    answer = ''
    cur_left, cur_right = 10, 12
    for num in numbers:
        if num == 0:
            num = 11

        if num % 3 == 1: # 왼쪽 열
            cur_left = num
            answer += 'L'
        elif num % 3 == 0: # 오른쪽 열
            cur_right = num
            answer += 'R'
        else: # 2, 5, 8, 0 경우의 수
            dist_from_left = get_dist(cur_left, num)
            dist_from_right = get_dist(cur_right, num)
            if dist_from_left < dist_from_right: #왼쪽 손이 더 가까운 경우
                cur_left = num
                answer += 'L'
            elif dist_from_left > dist_from_right: #오른쪽 손이 더 가까운 경우
                cur_right = num
                answer += 'R'
            else: # 거리가 같은 경우 어느 손잡이인지 따진다
                if hand == "right":
                    cur_right = num
                    answer += 'R'
                else:
                    cur_left = num
                    answer += 'L'

    return answer

*은 10으로 0은 11로 #은 12로 치환해서 풀었다. 그러면 해당 숫자에서 //3을 하면 행의 위치가 나오고, (해당 숫자 -1) % 3을 하면 열의 위치가 나온다.

다른 사람 풀이

def solution(numbers, hand):
    answer = ''
    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)}

    left = [1,4,7]
    right = [3,6,9]
    lhand = '*'
    rhand = '#'
    for i in numbers:
        if i in left:
            answer += 'L'
            lhand = i
        elif i in right:
            answer += 'R'
            rhand = i
        else:
            curPos = key_dict[i]
            lPos = key_dict[lhand]
            rPos = key_dict[rhand]
            ldist = abs(curPos[0]-lPos[0]) + abs(curPos[1]-lPos[1])
            rdist = abs(curPos[0]-rPos[0]) + abs(curPos[1]-rPos[1])

            if ldist < rdist:
                answer += 'L'
                lhand = i
            elif ldist > rdist:
                answer += 'R'
                rhand = i
            else:
                if hand == 'left':
                    answer += 'L'
                    lhand = i
                else:
                    answer += 'R'
                    rhand = i

    return answer

비슷하지만 각 숫자의 행과 열의 위치를 미리 계산해서 dict로 저장함으로서 *, 0, #을 치환하는 과정이 없어졌다.

0개의 댓글