Today.dev

[PG_67256/Python] 키패드 누르기 본문

알고리즘/프로그래머스

[PG_67256/Python] 키패드 누르기

otu165 2021. 6. 22. 23:37

문제

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

 


풀이

2차원 배열에 키패드 숫자를 넣자니 좌표 구하기가 힘들고 좌표를 넣자니 숫자를 못 구하고, 고민하다가 그냥 딕셔너리로 만들어버렸다. 그리고 bfs 쓸 필요 없는 거 제출하고 나서 알았다; 스스로 난이도 높여서 풀었더라 😥 혹시 이거 보시는 분들은 편하게 절댓값으로 거리 구하세요..

from collections import deque

loc = {  # 키패드
    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)
}


def bfs(dest, thumb):  # 최단거리
    q = deque()
    q.append(loc[dest])

    dx = [0, 0, 1, -1]
    dy = [1, -1, 0, 0]

    visited = [[0] * 3 for _ in range(4)]
    x, y = loc[dest]
    visited[x][y] = 1

    while q:
        x, y = q.popleft()

        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]

            if 0 <= nx < 4 and 0 <= ny < 3:
                if visited[nx][ny] == 0:  # 방문 X
                    if (nx, ny) == thumb:
                        return visited[x][y]

                    visited[nx][ny] = visited[x][y] + 1
                    q.append((nx, ny))

    return 0


def left_or_right(dest, left, right, hand):  # 어떤 엄지로 누를것인가?
    lm = bfs(dest, left)
    rm = bfs(dest, right)

    if lm < rm:
        return 'L'
    elif rm < lm:
        return 'R'
    else:
        if hand == "left":
            return 'L'
        else:
            return 'R'


def solution(numbers, hand):
    answer = ''

    left, right = (3, 0), (3, 2)
    for i in numbers:
        if i in (1, 4, 7):
            answer += 'L'
            left = loc[i]
        elif i in (3, 6, 9):
            answer += 'R'
            right = loc[i]
        else:
            answer += left_or_right(i, left, right, hand)
            if answer[-1] == 'L':
                left = loc[i]
            else:
                right = loc[i]

    return answer
Comments