문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/67256
문제 풀이)
시뮬레이션 문제였던것 같다.
초반에 키패드를 저장할 자료구조를 잘 선택했다면 쉽게 해결할 수 있었을 것이나 단순히 left, mid, right 배열의 인덱스 값으로 문제를 처리하려고 해서 코드가 많이 지져분해졋다.
def solution(numbers, hand):
answer = ''
left, right = 3, 3
keypad = {'l': [1, 4, 7], 'm': [2, 5, 8, 0], 'r': [3, 6, 9]}
l_mid, r_mid = False, False
for num in numbers:
if num in keypad['l']:
answer += 'L'
left = keypad['l'].index(num)
l_mid = False
elif num in keypad['r']:
answer += 'R'
right = keypad['r'].index(num)
r_mid = False
else:
target = keypad['m'].index(num)
if l_mid and r_mid:
if abs(target-left) > abs(target-right):
answer += 'R'
right = target
r_mid = True
elif abs(target-left) < abs(target-right):
answer += 'L'
left = target
l_mid = True
else:
if hand == 'right':
answer += 'R'
right = target
r_mid=True
else:
answer += 'L'
left = target
l_mid = True
continue
if l_mid:
if abs(target - left) > abs(target - right) + 1:
answer += 'R'
right = target
r_mid = True
elif abs(target - left) < abs(target - right) + 1:
answer += 'L'
left = target
l_mid = True
elif abs(target - left) == abs(target - right) + 1:
if hand == 'right':
answer += 'R'
right = target
r_mid = True
elif hand == 'left':
answer += 'L'
left = target
l_mid = True
continue
if r_mid:
if abs(target - left) + 1 > abs(target - right):
answer += 'R'
right = target
r_mid = True
elif abs(target - left) + 1 < abs(target - right):
answer += 'L'
left = target
l_mid = True
elif abs(target - left) + 1 == abs(target - right):
if hand == 'right':
answer += 'R'
right = target
r_mid = True
elif hand == 'left':
answer += 'L'
left = target
l_mid = True
continue
if abs(target - left) > abs(target - right):
answer += 'R'
right = target
r_mid = True
elif abs(target - left) < abs(target - right):
answer += 'L'
left = target
l_mid = True
else:
if hand == 'right':
answer += 'R'
right = target
r_mid = True
elif hand == 'left':
answer += 'L'
left = target
l_mid = True
return answer
만약 딕셔너리 자료구조로 각 키패드의 번호에 해당하는 인덱스 값을 부여한후 풀었다면 다음과 같이 더 가독성있게 문제를 풀 수 있었다.(프로그래머스 다른 사람의 풀이 참조)
def solution(numbers, hand):
answer = ''
key_dict = {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]
lhand = '*'
rhand = '#'
for i in numbers:
if i in left:
answer += 'L'
lhand = i
elif i in right:
answer += 'R'
rhand = i
else:
curPos = key_dict[i]
lPos = key_dict[lhand]
rPos = key_dict[rhand]
ldist = abs(curPos[0]-lPos[0]) + abs(curPos[1]-lPos[1])
rdist = abs(curPos[0]-rPos[0]) + abs(curPos[1]-rPos[1])
if ldist < rdist:
answer += 'L'
lhand = i
elif ldist > rdist:
answer += 'R'
rhand = i
else:
if hand == 'left':
answer += 'L'
lhand = i
else:
answer += 'R'
rhand = i
return answer
'Algorithm' 카테고리의 다른 글
[프로그래머스 - lv1] 기사단원의 무기 파이썬 (4) | 2023.03.06 |
---|---|
[프로그래머스 - lv1, 2018 KAKAO BLIND RECRUITMENT] - [1차] 비밀지도 (0) | 2023.03.03 |
[프로그래머스 - lv3] 부대복귀 (0) | 2023.02.23 |
[프로그래머스-lv2] 우박수열의 정적분 (0) | 2023.02.23 |
[프로그래머스-lv2]디펜스 게임/파이썬 (0) | 2023.02.22 |