본문 바로가기
코딩테스트

키패드 누르기

by 느림보어른 2021. 5. 30.

문제풀이

def solution(numbers, hand):
    answer = ''
    left = [1, 4, 7, '*']
    middle = [2, 5, 8, 0]
    right = [3, 6, 9, '#']
    
    l_point = [3, 1]
    r_point = [3, 1]
    
    for number in numbers:
        if number in left:
            answer += "L"
            l_point[0] = left.index(number)
            l_point[1] = 1
        elif number in right:
            answer += "R"
            r_point[0] = right.index(number)
            r_point[1] = 1
        else:
            l_abs = abs(l_point[0] - middle.index(number)) + l_point[1]
            r_abs = abs(r_point[0] - middle.index(number)) + r_point[1]
            if l_abs > r_abs:
                r_point[0] = middle.index(number)
                r_point[1] = 0
                answer += "R"
            elif l_abs < r_abs:
                l_point[0] = middle.index(number)
                l_point[1] = 0
                answer += "L"
            else:
                if hand == "right":
                    r_point[0] = middle.index(number)
                    r_point[1] = 0
                    answer += "R"
                else:
                    l_point[0] = middle.index(number)
                    l_point[1] = 0
                    answer += "L"          
    
    return answer

알고리즘

간단한 문제였다. 내 풀이에 대해 쉽게 설명하자면

  1. 왼쪽 엄지만 누를 수 있는 번호를 left, 오른쪽 엄지만 누를 수 있는 번호를 right, 중간 번호를 middle배열에 저장한다.
  2. 처음 왼쪽 엄지 위치와 오른쪽 엄지의 위치를 각각 l_point, r_point에 저장한다. 첫 번째 원소는 y축 위치(위에서부터 0~3), 두 번째 원소는 엄지가 left(right)에 있을 때 1, 중간에 있을 때 0이다.
  3. 누를 번호를 반복하면서 번호의 위치에 따라 누를 엄지를 결정한다.
  4. 이때 번호가 middle 배열에 있는 경우 거리를 계산한다. 여기서  y축 거리와 엄지가 middle에 있는 경우 0을 더해주고 아닌 경우 1을 더해줘서 계산한다. (엄지는 상하좌우로 밖에 움직이지 못하므로 left(right)에 있는 경우 중간으로 가기 위해 한 번 움직여야 한다. 반면 middle에 있는 경우 y축 이동만 하므로 0을 더해준다. 2번에서 엄지의 위치를 그렇게 정한 이유다.)

출처

문제: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

 

코딩테스트 연습

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

'코딩테스트' 카테고리의 다른 글

게임 맵 최단거리  (0) 2021.06.01
3진법 뒤집기  (0) 2021.06.01
튜플  (0) 2021.05.29
행렬 테두리 회전하기  (0) 2021.05.29
음양 더하기  (0) 2021.05.29