[구현] PRG 67256: 키패드 누르기

KimRiun·2021년 10월 8일
0

알고리즘_문제

목록 보기
16/26

사용 언어: python 3.9.5

❓ Problem

문제 설명

https://programmers.co.kr/learn/courses/30/lessons/67256

난이도

level 1

🚩 Solution

시도 01)

1. 접근법

딕셔너리에 좌표를 저장해두고 거리를 계산한다.

2. 코드


def solution(numbers, hand):
    dic = {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), 0: (3, 1)}

    answer = []
    left = (3,0)
    right = (3,2)
    for n in numbers:
        if n in [1, 4, 7]:
            answer.append('L')
            left = dic[n]
        elif n in [3, 6, 9]:
            answer.append('R')
            right = dic[n]
        else:
            left_n = abs(dic[n][0]-left[0]) + abs(dic[n][1]-left[1])
            right_n = abs(dic[n][0]-right[0]) + abs(dic[n][1]-right[1])
            if left_n == right_n:
                if hand == "left":
                    answer.append('L')
                    left = dic[n]
                else:
                    answer.append('R')
                    right = dic[n]
            elif left_n < right_n:
                answer.append('L')
                left = dic[n]
            else:
                answer.append('R')
                right = dic[n]
        # print(f"left: {left}, right: {right}, answer: {answer}")
    return ''.join(answer)

3. 시간복잡도

O(n)O(n)

4. 결과

성공

5. 소요 시간

33분

📕 피드백

과거에도 푼 문제였음

과거 풀이

def solution(numbers, hand):
    nums = [[j+(i*3) for j in range(0, 3)]for i in range(4)]

    L_pos: int = 9
    R_pos: int = 11
    answer = ''
    for n in numbers:
        # 숫자 전처리
        if n == 0:
            n = 10
        else:
            n -= 1

        # 가장자리
        if n in [0, 3, 6]:
            answer += 'L'
        elif n in [2, 5, 8]:
            answer += 'R'
        else:
            # 더 가까운 거리 비교
            L_dis = abs((L_pos//3) - (n//3)) + abs((L_pos % 3) - (n % 3))
            R_dis = abs((R_pos // 3) - (n // 3)) + abs((R_pos % 3) - (n % 3))

            if L_dis == R_dis:
                answer += 'L' if hand[0] == 'l' else 'R'
            else:
                answer += 'L' if L_dis < R_dis else 'R'

        if answer[-1] == 'L':
            L_pos = n
        else:
            R_pos = n

    return answer
profile
Java, Python

0개의 댓글