본문 바로가기

알고리즘 삽질장

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

반응형


문제설명

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

사고과정

  • 우선 주어지는 키패드 좌표를 2차원 배열로 나타내었다. 이유는 키패드 간의 거리를 계산하기 위해서. 거리 계산할 때는 맨해튼 거리 기법을 사용했다. 주어진 거리가 1이라고 해서 맨해튼 거리를 적용할 수 있었다.
  • 한 가지 중요한 점은 find_xy라는 target 값이 주어졌을 때, 키패드에서 target 값을 찾는 함수를 정의해서 사용했다.
  • 그리고 초기좌표를 왼손은 *, 오른손은 #이 있는 좌표로 설정해주고 1,4,7이면 무조건 왼손으로 결과값을 추가한 다음 find_xy 함수를 사용해 왼손의 위치 좌표를 업데이트시켜준다. 3,6,9일 때는 오른손을 사용해야 하므로 이도 마찬가지로 적용
  • 그리고 2,5,8,0일 경우에는 target 값의 좌표를 우선 찾은 다음, 현재 왼손, 오른손 위치와 각각 거리를 잰 후 왼손거리가 더 작으면 왼손을 결과값으로 추가한 후 왼손의 위치를 target 값 좌표로 업데이트 시켜준다. 만약 오른손 거리가 더 작으면 오른손을 업데이트
  • 만약 둘 거리가 같다면 문제에서 주어지는 왼손 또는 오른손잡이 hand 변수에 따라 결과값 추가해주고 해당 손의 위치를 target 좌표로 업데이트 해주면 됨!

풀이

arr = [[1,2,3],[4,5,6],[7,8,9],['*',0,'#']]

def find_xy(target):
    for i in range(len(arr)):
        for j in range(len(arr[0])):
            if arr[i][j] == target:
                x, y = i, j
                return x, y


def solution(numbers, hand):
    # 초기 왼손, 오른손 위치
    left = (3, 0)
    right = (3, 2)
    
    answer = ''
    for num in numbers:
        # 1,4,7일 경우 -> 왼손 사용 & 왼손 위치 업데이트 
        if num in [1,4,7]:
            left = find_xy(num)
            answer += 'L'
        # 3,6,9일 경우 -> 오른손 사용 & 오른손 위치 업데이트
        elif num in [3,6,9]:
            right = find_xy(num)
            answer += 'R'
        # 2,5,8,0일 경우
        else:
            # num의 좌표 찾기
            t_x, t_y = find_xy(num)
            # 현재 왼손, 오른손과의 거리 비교
            left_dist = abs(left[0]-t_x) + abs(left[1]-t_y)
            right_dist = abs(right[0]-t_x) + abs(right[1]-t_y)
            
            if left_dist < right_dist:
                left = t_x, t_y
                answer += 'L'
            elif right_dist < left_dist:
                right = t_x, t_y
                answer += 'R'
            else:
                if hand == 'left':
                    left = t_x, t_y
                    answer += 'L'
                else:
                    right = t_x, t_y
                    answer += 'R'
    return answer
반응형