스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.맨 처음 왼손 엄지손가락은 *
키패드에 오른손 엄지손가락은 #
키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
1
, 4
, 7
을 입력할 때는 왼손 엄지손가락을 사용합니다.3
, 6
, 9
를 입력할 때는 오른손 엄지손가락을 사용합니다.2
, 5
, 8
, 0
을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
"left"
또는 "right"
입니다."left"
는 왼손잡이, "right"
는 오른손잡이를 의미합니다.L
, 오른손 엄지손가락을 사용한 경우는 R
을 순서대로 이어붙여 문자열 형태로 return 해주세요.numbers | hand | result |
---|---|---|
[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] | "right" | "LRLLLRLLRRL" |
[7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] | "left" | "LRLLRRLLLRR" |
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0] | "right" | "LLRLLRLLRL" |
def solution(numbers, hand):
answer = ''
#키패드 위치
pad = {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)
}
#왼,오,중간 기준 배열
left = [1,4,7]
right = [3,6,9]
mid = [2,5,8,0]
#현재 손의 위치
c_left = pad['*']
c_right = pad['#']
for num in numbers:
if num in left:
answer += 'L'
c_left = pad[num]
if num in right:
answer += 'R'
c_right = pad[num]
if num in mid:
c_mid = pad[num] #중간열에 해당하는 num의 위치값 저장
l_len = abs(c_mid[0] - c_left[0]) + abs(c_mid[1] - c_left[1]) #왼쪽 거리
r_len = abs(c_mid[0] - c_right[0]) + abs(c_mid[1] - c_right[1]) #오른쪽 거리
if l_len < r_len:
answer += 'L'
c_left = pad[num]
if l_len > r_len:
answer += 'R'
c_right = pad[num]
if l_len == r_len:
if hand == "right":
answer += 'R'
c_right = pad[num]
else:
answer += 'L'
c_left = pad[num]
return answer
카카오는 정말 누가 가는 기업일까?.. 이 정도 난이도가 Level 1이라니....
암튼 굉장히 머리 아픈 문제였고.. 3가지 관점에서 생각해보면 풀 수 있다.
*
, #
에서 위치 초기화 일단 3번 때문에 BFS로 시뮬레이션으로 풀어야되나 고민을 했었는데.. 사실 그건 위치를 누적해나갈때 필요한 알고리즘이고, 여기서는 뭐 따로 계산할 필요 없이 바뀐 엄지의 위치값을 갱신만 해주면 된다.
1번에 대한 아이디어를 각 번호별로 위치값을 dict
로 선언해주면 해결할 수 있다.
사실 이 부분 아이디어만 구상했다면 절반이상은 해결한거나 마찬가지.. 나머지는 L,R로 분기문만 꼼꼼히 작성해주면 구현이 끝난다.
다만 주의할 점은, 거리가 같은 엄지 계산을 할때 abs
절댓값으로 계산을 해야한다.