[programmers] lv.1 키패드 누르기

jeongjeong2·2023년 1월 25일
0

For coding test

목록 보기
25/59

문제 설명 문제 바로가기

스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.

제한 사항

numbers 배열의 크기는 1 이상 1,000 이하입니다.
numbers 배열 원소의 값은 0 이상 9 이하인 정수입니다.
hand는 "left" 또는 "right" 입니다.
"left"는 왼손잡이, "right"는 오른손잡이를 의미합니다.
왼손 엄지손가락을 사용한 경우는 L, 오른손 엄지손가락을 사용한 경우는 R을 순서대로 이어붙여 문자열 형태로 return 해주세요.

입출력 예

문제 접근

  • 풀이시간 30분
  • 거리를 구하는 데에 있어서 이게 맞나 하는 생각에 좀 버벅인 것 같다.
  • dic 정의에 있어서 key : value로 입력하는 걸로 깔끔하게 append할 것.
  • 좌표로 설정해서 거리만 정의해주면 문제 자체는 쉽게 풀린다.
  • 복잡한 문제 풀 때는 보기 편하게 + 주석 달아가면서 내가 알아볼 수 있고 풀이하자.

나의 풀이

def distance(a,b): #a,b사이의 거리 구하는 함수
    return abs(a[0]-b[0]) + abs(a[1]-b[1])

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],
           '*':[3, 0], 0: [3, 1], '#': [3, 2]}
    answer = ''
    left = [1,4,7]
    right = [3,6,9]
    left_now = dic['*']
    right_now = dic['#']
    for i in numbers:
        now = dic[i]
        if i in left: #1,4,7은 무조건 left사용
            answer += 'L'
            left_now = now
        elif i in right: #3,6,9는 무조건 right사용
            answer += 'R'
            right_now = now
        else: #2,5,8,0일 경우
            if distance(dic[i],right_now)>distance(dic[i],left_now): #left가 더 가까우면
                answer += 'L'
                left_now = now
            elif distance(dic[i],right_now)<distance(dic[i],left_now): #right이 더 가까우면
                answer += 'R'
                right_now = now
            else: #같을 경우엔
                if hand == 'right': #오른손잡이
                    answer += 'R'
                    right_now = now
                else: #왼손잡이
                    answer += 'L'
                    left_now = now 
    return answer

다른 사람 풀이

  • 거리를 하나하나 구해서 2차원 배열로 놓고, 풀이한 경우를 제외하곤 다 비슷하게 푼 것 같다. ideatic 풀이보다 정말 하나하나 경우를 놓치지 않고 풀이하는 것이 중요.
    확률과 통계 경우의 수 문제 푸는 거랑 느낌이 비슷하다.

0개의 댓글