정리 노트

프로그래머스 키패드 누르기(Python) 본문

프로그래머스 코딩테스트 연습

프로그래머스 키패드 누르기(Python)

꿈만 꾸는 학부생 2022. 6. 24. 23:07
728x90

https://programmers.co.kr/learn/courses/30/lessons/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

DFS/BFS 문제를 푼 이후 휴식을 가지기 위해 레벨 1 문제를 잡았다. 처음 문제를 보고 생각할 때는

"이거 그냥 if-else의 파티겠는데?" 생각했고, 맘에 안 들지만 그 방법만 생각이 나서 이번 코드의 길이가 좀... 길다...

다 풀고 다른 사람들은 얼마나 깔끔하게 풀었을까 하고 풀이들을 봤는데.. 대부분 나랑 비슷했다.. 하하....

 

이 문제에서 최소 거리를 구하는데 처음에는 바로 유클리드 거리를 구하는 방식을 사용했지만 일부 문제에서 틀렸다... 여기서 살짝 멘털이 흔들렸다. 그러다 깨달았다. 손가락은 '상, 하, 좌, 우' 로만 이동한다는 것을! 이런 상황에서는 유클리드 거리를 구하는 것보다 맨해튼 거리를 구하는 게 더 낫다. 맨해튼 거리는 유클리드 거리를 구하는 식에서 제곱을 빼고 절댓값 기호를 넣어주면 된다.

 

이렇게 푼 코드가 아래와 같다.

def solution(numbers, hand):
    answer = ''
    key_pad = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [-1, 0, -1]]    # *과 #는 -1로 표현
    left_pos, right_pos = [3, 0], [3, 2]    # [row, column]
    for n in numbers:
        if n % 3 == 1:
            answer += 'L'
            left_pos[0], left_pos[1] = n // 3, 0
        elif n != 0 and n % 3 == 0:
            answer += 'R'
            right_pos[0], right_pos[1] = n // 3 - 1, 2
        else:
            r, c = -1, 1
            if n == 0:
                r = 3
            else:
                r = n // 3
            left_dist = abs(r - left_pos[0]) + abs(c - left_pos[1])
            right_dist = abs(r - right_pos[0]) + abs(c - right_pos[1])
            if left_dist == right_dist:
                moving_hand = hand.upper()[0]
                answer += moving_hand
                if moving_hand == 'L':
                    left_pos[0], left_pos[1] = r, c
                else:
                    right_pos[0], right_pos[1] = r, c
            elif left_dist < right_dist:
                answer += 'L'
                left_pos[0], left_pos[1] = r, c
            else:
                answer += 'R'
                right_pos[0], right_pos[1] = r, c
    return answer

프로그래머스 채점 서버에서 최대 0.60ms, 메모리 사용량은 변화 없이 일정했다.

728x90