프로그래머스 | 2020 카카오 인턴십 | 키패드 누르기 [파이썬 python]

2023. 5. 19. 14:58·Algorithm/프로그래머스
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

방법 1) 각 키까지의 거리를 사전에 정의하기

def solution(numbers, hand):
    # 각 키에서 0~9키 까지의거리(키:[각 번호까지의 거리])
    key = {0: [0, 4, 3, 4, 3, 2, 3, 2, 1, 2],  
           1: [4, 0, 1, 2, 1, 2, 3, 2, 3, 4],
           2: [3, 1, 0, 1, 2, 1, 2, 3, 2, 3],
           3: [4, 2, 1, 0, 3, 2, 1, 4, 3, 2],
           4: [3, 1, 2, 3, 0, 1, 2, 1, 2, 3],
           5: [2, 2, 1, 2, 1, 0, 1, 2, 1, 2],
           6: [3, 3, 2, 1, 2, 1, 0, 3, 2, 1],
           7: [2, 2, 3, 4, 1, 2, 3, 0, 1, 2],
           8: [1, 3, 2, 3, 2, 1, 2, 1, 0, 1], 
           9: [2, 4, 3, 2, 3, 2, 1, 2, 1, 0],
           '*': [1, 3, 4, 5, 2, 3, 4, 1, 2, 3],
           '#': [1, 5, 4, 3, 4, 3, 2, 3, 2, 1]
          } 
          
    left, right = '*', '#'
    result = ''
    for i in numbers:
        if i in [1, 4, 7]:
            result += 'L'
            left = i
        elif i in [3, 6, 9]:
            result += 'R'
            right = i
        else:
            # 거리
            ll = key[left][i]
            rr = key[right][i]
            if ll == rr:
                if hand == 'right':
                    right = i
                    result += 'R'
                else:
                    left = i
                    result += 'L'
            elif ll < rr:
                left = i
                result += 'L'
            else:
                right = i
                result +='R'
                
    return result

현재 위치한 손가락에서부터 다음으로 눌러야 할 버튼까지의 거리를 구해 어떤 손가락으로 눌러야 할지 판단하는 문제이다.

매번 거리를 계산하는 것보다는 주어진 키패드가 0부터 9까지 10개뿐이기 때문에 미리 각 키에서의 거리를 계산해 두고 그때그때 필요한 값을 꺼내 쓰는 게 더 효율적일 것이라고 생각했다.

그래서 key라는 이름으로 딕셔너리를 키:[각 번호까지의 거리] 형태로 만든 다음, 각 키에서 0번까지의 거리를 0번 인덱스에, 1번까지의 거리를 1번 인덱스에... 9번까지의 거리를 9번 인덱스에 저장하였다.

1, 4, 7과 3, 6, 9일 때는 각각 왼손 오른손을 쓸 수 있게 해 주었고, 어떤 손을 사용했는지 result에 추가한 뒤 손가락의 위치 left, right를 갱신해 주는 방식으로 진행했다.

# 거리
ll = key[left][i]
rr = key[right][i]

2, 5, 8, 0일 때는 현재 left, right에서 눌러야 하는 키까지의 거리를 각각 ll, rr로 딕셔너리 key에서 찾은 다음 크기 비교를 통해 어떤 손을 사용할지 조건문으로 작성하였다.

 

 

방법 2) 각 키의 좌표를 이용해 거리 구하기

def solution(numbers, hand):
    # 각 키의 좌표
    key = {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],
           0: [3, 1],
           '*': [3, 0],
           '#': [3, 2]
          }
    
    left, right = key['*'], key['#']
    result = ''
    for i in numbers:
        if i in [1, 4, 7]:
            result += 'L'
            left = key[i]
        elif i in [3, 6, 9]:
            result += 'R'
            right = key[i]
        else:
            # 거리
            num = key[i]
            ll = abs(left[0] - num[0]) + abs(left[1] - num[1])
            rr = abs(right[0] - num[0]) + abs(right[1] - num[1])
            if ll == rr:
                if hand == 'left':
                    left = key[i]
                    result += 'L'
                else:
                    right = key[i]
                    result += 'R'
            elif ll < rr:
                left = key[i]
                result += 'L'
            else:
                right = key[i]
                result += 'R'
    
    return result

문제를 다 풀고 나서 다른 사람들의 코드를 보니 각 키별로 좌표 값을 저장하여 거리를 계산해 주는 방식의 코드가 많아서 이미 정답 처리가 되었지만 다양한 방식을 익혀보기 위해 코드를 작성해 보았다.

전체적인 과정은 유사하나 key를 정의하는 것과 거리를 구하는 부분이 조금 다르다.

1번 방법과 달리 2번 방법은 딕셔너리 key에 각 키의 좌표 값을 저장하였다.

각 키의 좌표를 오른쪽 그림에서 보이는 대로 [행, 열]을 형태로 저장하였다.

# 각 키의 좌표
key = {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],
       0: [3, 1],
       '*': [3, 0],
       '#': [3, 2]
      }

그렇기 때문에 각 손가락에서 눌러야 하는 키까지의 거리를 구할 때 x좌표는 x좌표끼리, y좌표는 y좌표끼리 연산해주어야 한다.

 

# 거리
num = key[i]
ll = abs(left[0] - num[0]) + abs(left[1] - num[1])
rr = abs(right[0] - num[0]) + abs(right[1] - num[1])

손가락의 위치와 눌러야 하는 키의 위치 중 어떤 값이 더 큰지 알 수 없기 때문에 절댓값을 구하는 abs() 함수를 사용하였다.

 

저작자표시 (새창열림)
'Algorithm/프로그래머스' 카테고리의 다른 글
  • 프로그래머스 | 2022 KAKAO BLIND RECRUITMENT | 신고 결과 받기 [파이썬 python]
  • 프로그래머스 | 2023 KAKAO BLIND RECRUITMENT | 개인정보 수집 유효기간 [파이썬 python]
  • 프로그래머스 | 2019 카카오 개발자 겨울 인턴십 | 크레인 인형뽑기 게임 [파이썬 python]
  • 프로그래머스 | 옹알이(2) [파이썬 python]
dduniverse
dduniverse
  • dduniverse
    dduniverse
    dduniverse
  • 전체
    오늘
    어제
    • 분류 전체보기 (245)
      • Algorithm (123)
        • 알고리즘 이론 (8)
        • 백준 (19)
        • 프로그래머스 (83)
        • 구름 알고리즘 먼데이 챌린지 (13)
      • 빅데이터분석기사 (10)
        • 통계 (4)
        • 실기 (6)
      • KT에이블스쿨 (26)
      • FrontEnd (11)
        • React (5)
        • 기타 (6)
      • BackEnd (18)
        • Django (15)
        • Spring (3)
      • DS & ML (11)
        • Machine Learning (9)
        • Kaggle (2)
      • TIL (46)
        • python (22)
        • javascript (3)
        • 오류해결 (10)
        • 기타 (10)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 관리
    • 글쓰기
  • 링크

  • 인기 글

  • hELLO· Designed By정상우.v4.10.0
dduniverse
프로그래머스 | 2020 카카오 인턴십 | 키패드 누르기 [파이썬 python]
상단으로

티스토리툴바