문제 설명
스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
-
엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
-
왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용합니다.
-
오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용합니다.
-
가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.
4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.
순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
-
numbers 배열의 크기는 1 이상 1,000 이하입니다.
-
numbers 배열 원소의 값은 0 이상 9 이하인 정수입니다.
-
hand는 "left" 또는 "right" 입니다.
-
"left"는 왼손잡이, "right"는 오른손잡이를 의미합니다.
-
-
왼손 엄지손가락을 사용한 경우는 L, 오른손 엄지손가락을 사용한 경우는 R을 순서대로 이어붙여 문자열 형태로 return 해주세요.
출처 : programmers.co.kr/learn/courses/30/lessons/67256
풀이 방법
이 문제를 해결하는 키포인트는 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때 두 엄지손가락의 현재 키패드로부터 해당 숫자까지의 거리를 구하는 것이다.
위의 출처 링크에 들어가면 입출력 예를 볼 수 있는데, 여기서 오른손의 위치가 3일 때 눌러야 할 숫자가 5일 경우 오른손으로부터의 거리는 2라고 하였다. 이 예시를 보고 맨해튼 거리(Manhattan distance)를 구하는 문제로 풀어봐야겠다고 생각했다.
맨해튼 거리를 구하는 방법은 우리가 흔히 알고 있는 피타고라스의 정리를 이용한 유클리드 거리(Euclidean distance)와 달리 두 점 사이의 거리를 구할 때 각 차원의 차의 절대값을 사용해서 합산한다.
숫자들의 위치를 행렬처럼 표현하여 특정 숫자의 위치를 반환해줄 코드와 맨해튼 거리를 구하는 코드가 필요하다고 생각됐다. 아래는 문제를 풀 때 사용한 소스 코드이다.
소스 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
import numpy as np
def solution(numbers, hand):
answer = ''
hand_loc = ['*', '#']
for num in numbers:
if num == 1 or num == 4 or num == 7:
answer += 'L'
hand_loc[0] = num
elif num == 3 or num == 6 or num == 9:
answer += 'R'
hand_loc[1] = num
else:
left_distance = manhattan_distance(num_location(num), num_location(hand_loc[0]))
right_distance = manhattan_distance(num_location(num), num_location(hand_loc[1]))
if left_distance < right_distance:
answer += 'L'
hand_loc[0] = num
elif left_distance > right_distance:
answer += 'R'
hand_loc[1] = num
else:
if hand == 'left':
answer += 'L'
hand_loc[0] = num
else:
answer += 'R'
hand_loc[1] = num
return answer
def num_location(num):
metrix = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
['*', 0, '#']])
x = np.where(metrix==str(num))[0][0]
y = np.where(metrix==str(num))[1][0]
num_loc = [x, y]
return np.array(num_loc)
def manhattan_distance(arr1, arr2):
sub_arr = arr1 - arr2
distance = abs(sub_arr[0]) + abs(sub_arr[1])
return distance
|
cs |
num_location 함수는 전화 키패드를 행렬처럼 표현하고 특정 숫자에 대한 (x, y) 좌표 값을 반환해주는 함수이고, manhattan_distance 함수는 맨해튼 거리 값을 반환해주는 함수이다.
'프로그래머스 공부 > Python' 카테고리의 다른 글
[Level 1 / Python] 두 개 뽑아서 더하기(월간 코드 챌린지 시즌1) (0) | 2020.11.08 |
---|---|
[Level 1 / Python] 내적(월간 코드 챌린지 시즌1) (1) | 2020.11.07 |
[Level 1 / Python] 완주하지 못한 선수 (2) | 2019.12.04 |
[Level 1 / Python] 모의고사 (1) | 2019.12.04 |
[Level 1 / Python] K번째수 (1) | 2019.12.04 |