알고리즘/문제풀이
[Python] Programmers 키패드 누르기
정찡이
2021. 9. 4. 15:37
728x90
1. 문제 링크
https://programmers.co.kr/learn/courses/30/lessons/67256
코딩테스트 연습 - 키패드 누르기
[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"
programmers.co.kr
2. 문제 요약


3. 아이디어 정리
- 번호가 왼쪽 방향인 경우 왼쪽 손
- 번호가 오른쪽 방향인 경우 오른쪽 손
- 중간인 경우, 왼손 오른손 계산을 진행한다.
- 거리 계산하는 방식은 아래와 같다. (왼손 거리 구하는 경우 예시)
- 손이 가운데 있는 경우

- 손이 가운데 있는 경우
- 손이 왼쪽 라인에 있는 경우 , 목표 번호 - 1을 진행하여 왼쪽 라인으로 이동한다. 현재 왼손 - (목표 번호 - 1) // 3을 하여 거리를 구한다.

4. 문제 풀이
4-1. 내 풀이
def solution(numbers, hand):
answer = ''
left = 10 # *
right = 12 # #
for num in numbers:
if num in [1, 4, 7]: # 1. 왼쪽 방향에 있는 경우
answer += 'L'
left = num
elif num in [3, 6, 9]: # 2. 오른쪽 방향에 있는 경우
answer += 'R'
right = num
else: # 3. 중간에 있는 경우
if num == 0: num = 11 # 0인 경우 11로 대체
# 3-1. left에서 거리 구하기
if left in [2, 5, 8, 11]: # 현재 손이 가운데 있는 경우
left_dis = abs(num - left) // 3
else: # 현재 손이 왼쪽에 있는 경우, 현재 수에서 - 1 시켜 왼쪽 키패드로 이동 후 계산
left_num = num - 1
left_dis = abs(left - left_num) // 3 + 1
# 3-2. right에서 거리 구하기
if right in [2, 5, 8, 11]:
right_dis = abs(num - right) // 3
else:
right_num = num + 1
right_dis = abs(right - right_num) // 3 + 1
# 3-3. 왼쪽, 오른쪽 거리 비교하여 값 넣기
if left_dis < right_dis:
answer += 'L'
left = num
elif left_dis > right_dis:
answer += 'R'
right = num
else: # 같은 경우 hand 따라 다르게 세팅
if hand == 'right':
answer += 'R'
right = num
else:
answer += 'L'
left = num
return answer
5. 결론
- 가운데 키패드를 눌러야하는 경우 거리를 구하는 것이 복잡했던 문제
반응형