스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
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 풀이보다 정말 하나하나 경우를 놓치지 않고 풀이하는 것이 중요.
확률과 통계 경우의 수 문제 푸는 거랑 느낌이 비슷하다.