[알고리즘] 키패드 누르기

MINSEOK KIM·2021년 8월 20일
0

알고리즘

목록 보기
5/12

프로그래머스 2020 카카오 인턴십 코딩테스트에서 출제된 문제

키패드 누르기 문제

분석

문제는 이해가 가지만 구현을 어떻게 해야할지 한참 고민을 했다.

각 번호의 위치를 x,y에 위치로 표현하여 중앙 열을 누를때 거리 계산이 쉽도록 하였다.


1. 휴대폰 배열 구현

각 번호에 맞는 위치를 저장하였다. 시작은 *,#에서 시작한다.

phone = [[3,1],[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[2,0],[2,1],[2,2]]

빨간 원은 왼손 파란 원은 오른손으로 표시, 노란 원은 누를 번호


2. 중앙 열을 누를때 가까운 손 찾기

  1. 왼손과 누를 번호의 거리, 오른손과 누를 번호의 거리를 측정한다.
    왼손은 누를 번호와 2의 거리, 오른손은 누를 번호와 2의 거리만큼 떨어져 있다.
  2. 왼손 또는 오른손이 더 가까운 경우 -> 더 가까운 손을 사용한다.
  3. 두 손이 누를 번호와 같은 거리라면 hand 옵션에 있는 주로 사용하는 손을 사용한다. hand가 'right'라면 오른손을 사용한다.

코드

def check(pos1, pos2):
    return abs(pos1[0]-pos2[0])+abs(pos1[1]-pos2[1])

def solution(numbers, hand):
    answer = ''
    phone = [[3,1],[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[2,0],[2,1],[2,2]]
    left, right = [3,0],[3,2]
    for i in numbers:
        if i in [1,4,7]:
            left = phone[i]
            answer+='L'
        elif i in [3,6,9]:
            right = phone[i]
            answer+='R'
        elif i in [2,5,8,0]:
            leftCnt = check(left, phone[i])
            rightCnt = check(right, phone[i])
            if leftCnt>rightCnt:
                right = phone[i]
                answer+='R'
            elif leftCnt<rightCnt:
                left = phone[i]
                answer+='L'
            else:
                if hand=="right":
                    right = phone[i]
                    answer+='R'
                else:
                    left = phone[i]
                    answer+='L'
    return answer

0개의 댓글

관련 채용 정보