[Lv.1] 키패드 누르기
문제
스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 *
키패드에 오른손 엄지손가락은 #
키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
1. 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
2. 왼쪽 열의 3개의 숫자1, 4, 7
을 입력할 때는 왼손 엄지손가락을 사용합니다.
3. 오른쪽 열의 3개의 숫자3, 6, 9
를 입력할 때는 오른손 엄지손가락을 사용합니다.
4. 가운데 열의 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 해주세요.
Link
https://school.programmers.co.kr/learn/courses/30/lessons/67256
code
def solution(numbers, hand):
answer = ''
# L,R 구분하여 대문자 변환
hand = hand[0]
hand = hand.upper()
# 키패드 리스트
phone = [1,2,3,4,5,6,7,8,9,'*',0,'#']
# 초기 값
Lnow = '*'
Rnow = '#'
for num in numbers:
# 왼손 저장
if num == 1 or num == 4 or num == 7:
answer += 'L'
Lnow = num
# 오른손 저장
elif num == 3 or num == 6 or num == 9:
answer += 'R'
Rnow = num
# 가운데 키패드가 입력되면
else:
# 왼쪽 손의 현재 위치를 인덱스로 저장
l = phone.index(Lnow)
li = l // 3
lj = l % 3
# 오른쪽 손의 현재 위치를 인덱스로 저장
r = phone.index(Rnow)
ri = r // 3
rj = r % 3
# 이동할 곳의 위치를 인덱스로 저장
index = phone.index(num)
i = index//3
j = index% 3
# 왼/오른손의 현재 위치와 이동 할 곳의 거리 계산
# 거리이므로 절댓값으로 계산
Llen = abs(li - i) + abs(lj-j)
Rlen = abs(ri-i) + abs(rj-j)
# 오른손이 가깝다면 오른손 저장
if Llen > Rlen:
answer += "R"
Rnow = num
elif Llen < Rlen:
answer += 'L'
Lnow = num
# 만약 거리가 같다면 사용자의 손잡이에 따라 저장
else:
answer += hand
if hand == 'L':
Lnow = num
else:
Rnow = num
return answer
1. 자판의 위치를 인덱스로 계산하여 열이 3개이므로 //3 %3 이용하여 행,렬 인덱스 파악.
2. 문제를 풀 수는 있지만 시간이 길어지고 코드가 길어짐.