[프로그래머스] 키패드 누르기 Python
in Study on Coding Test
정답코드
초기에 작성한 것이라 중복코드도 있다. 수정한 것은 맨 아래에.
def solution(numbers, hand):
key_pad =[
[1,4,7],
[2,5,8,0],
[3,6,9],
]
answer = ''
l_finger = [1,3] # 엄지손가락들의 처음위치
r_finger = [1,3]
# 1번 인덱스
# 엄지 손가락이 몇 행에 위치하여 있는가?
# 0번 인덱스
# 0 : 각 엄지가 2, 5, 8, 0에 위치할 때
# 1 : 위치가 3, 6, 9 에 위치할 때
for i in numbers:
if i in key_pad[2]: # 오른손으로 누를 때
answer += 'R'
r_finger = [1, key_pad[2].index(i)] # 손가락 위치 재지정
elif i in key_pad[0]: # 왼손으로 누를 때
answer += 'L'
l_finger = [1, key_pad[0].index(i)] # 손가락 위치 재지정
elif i in key_pad[1]: # 가운데 줄을 눌러야 할 경우
# 오른손 엄지가 더 멀리 있을 때
if abs(r_finger[1] - key_pad[1].index(i)) + r_finger[0] > abs(l_finger[1] - key_pad[1].index(i)) + l_finger[0]:
answer += 'L'
l_finger = [0, key_pad[1].index(i)] # 손가락 위치 재지정
# 왼손 엄지가 더 멀리 있을 때
elif abs(r_finger[1] - key_pad[1].index(i)) + r_finger[0] < abs(l_finger[1] - key_pad[1].index(i)) + l_finger[0]:
answer += 'R'
r_finger = [0, key_pad[1].index(i)] # 손가락 위치 재지정
# 거리가 같은 경우
elif abs(r_finger[1] - key_pad[1].index(i)) + r_finger[0] == abs(l_finger[1] - key_pad[1].index(i)) + l_finger[0]:
if hand == 'left':
answer += 'L'
l_finger = [0, key_pad[1].index(i)] # 손가락 위치 재지정
elif hand == 'right':
answer += 'R'
r_finger = [0, key_pad[1].index(i)] # 손가락 위치 재지정
return answer
소스코드 설명
l_finger과 r_finger을 통해서 엄지손가락의 위치를 지정해주었다.
여기서, 0번 인덱스는 가운데에 위치했는지 아닌지를 지정해주는 변수이다.
생각해보자!
만약에 1, 4, 7에 왼손 엄지손가락이 위치했다면 2, 5, 8, 0에 있는 버튼으로부터 멀어질 수 밖에 없다. 그래서 리스트의 첫 번째 변수를 1로 지정해주었다.
반대로, 엄지손가락이 2, 5, 8, 0에 위치했다면 거리는 자동으로 가까워지게 되므로
첫 번째 변수는 0으로 변한다.
# 거리가 같은 경우
elif abs(r_finger[1] - key_pad[1].index(i)) + r_finger[0] == abs(l_finger[1] - key_pad[1].index(i)) + l_finger[0]:
if hand == 'left':
answer += 'L'
l_finger = [0, key_pad[1].index(i)]
elif hand == 'right':
answer += 'R'
r_finger = [0, key_pad[1].index(i)]
위의 코드가 그 기능을 한다.
그리고, l_finger과 r_finger의 1번 인덱스는 위에서 몇 번째 행에 있는지 저장하는 역할을 한다.
예를 들어, 1은 왼손의 첫행, 3은 오른손의 첫행에 있고,
4, 6은 각각 2행, 7, 9는 각각 3행에 있다.
if abs(r_finger[1] - key_pad[1].index(i)) + r_finger[0] > abs(l_finger[1] - key_pad[1].index(i)) + l_finger[0]
위의 코드는 현재 손가락의 위치와 눌러야 할 키패드간의 거리를 계산한다.
키패드 배열을 생각하면
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
[*, 0, #]
이렇게 위치하므로
key_pad =[
[1,4,7],
[2,5,8,0],
[3,6,9],
]
위와 같이 키패드 리스트를 지정해주고, *과 #표시는 3행에 위치해있으므로
l_finger = [1,3] # 엄지손가락들의 처음위치
r_finger = [1,3]
처음 위치를 위와 같이 지정했다.
그렇게 한 뒤, 거리를 비교하거나 버튼의 위치에 따라 손가락들의 위치를 재지정해주면서
오른손으로 입력할지, 왼손으로 입력할지 결정하였다.
제출 결과
이왜진이라는게 이런걸까..?
놀랬다.. 진짜될 줄 몰랐다..
코드 수정 (중복 코드 정리)
복잡하고 긴 중복코드는 없애줘야 할 것!
def solution(numbers, hand):
key_pad =[
[1,4,7],
[2,5,8,0],
[3,6,9],
]
answer = ''
l_finger = [1,3] # 엄지손가락들의 처음위치
r_finger = [1,3]
# 1번 인덱스
# 엄지 손가락이 몇 행에 위치하여 있는가?
# 0번 인덱스
# 0 : 각 엄지가 2, 5, 8, 0에 위치할 때
# 1 : 위치가 3, 6, 9 에 위치할 때
for i in numbers:
if i in key_pad[2]: # 오른손으로 누를 때
answer += 'R'
r_finger = [1, key_pad[2].index(i)] # 손가락 위치 재지정
elif i in key_pad[0]: # 왼손으로 누를 때
answer += 'L'
l_finger = [1, key_pad[0].index(i)] # 손가락 위치 재지정
elif i in key_pad[1]: # 가운데 줄을 눌러야 할 경우
r_distance = r_finger[1] - key_pad[1].index(i)) + r_finger[0]
l_distance = abs(l_finger[1] - key_pad[1].index(i)) + l_finger[0]
# 오른손 엄지가 더 멀리 있을 때
if r_distance > l_distance:
answer += 'L'
l_finger = [0, key_pad[1].index(i)] # 손가락 위치 재지정
# 왼손 엄지가 더 멀리 있을 때
elif r_distance < l_distance:
answer += 'R'
r_finger = [0, key_pad[1].index(i)] # 손가락 위치 재지정
# 거리가 같은 경우
elif r_distance == l_distance:
if hand == 'left':
answer += 'L'
l_finger = [0, key_pad[1].index(i)] # 손가락 위치 재지정
elif hand == 'right':
answer += 'R'
r_finger = [0, key_pad[1].index(i)] # 손가락 위치 재지정
return answer