
주소: 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
[ 문제 ]


[ 나의 귀여운 풀이 ]
def solution(numbers, hand):
answer = ''
coordinate_l = [3, 0]
coordinate_r = [3, 2]
keyboard = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
['*', 0, '#']]
target_cord = [0, 0]
for targetNum in numbers:
for i in range(len(keyboard)):
if targetNum in keyboard[i]:
target_cord[0] = i
target_cord[1] = keyboard[i].index(targetNum)
if targetNum in [1, 4, 7]:
coordinate_l[0] = target_cord[0]
coordinate_l[1] = target_cord[1]
answer += 'L'
continue
elif targetNum in [3, 6, 9]:
coordinate_r[0] = target_cord[0]
coordinate_r[1] = target_cord[1]
answer += 'R'
continue
dist_l = abs(target_cord[0] - coordinate_l[0]) + abs(target_cord[1] - coordinate_l[1])
dist_r = abs(target_cord[0] - coordinate_r[0]) + abs(target_cord[1] - coordinate_r[1])
if dist_l > dist_r:
coordinate_r[0] = target_cord[0]
coordinate_r[1] = target_cord[1]
answer += 'R'
if dist_r > dist_l:
coordinate_l[0] = target_cord[0]
coordinate_l[1] = target_cord[1]
answer += 'L'
if dist_r == dist_l:
if hand == 'left':
coordinate_l[0] = target_cord[0]
coordinate_l[1] = target_cord[1]
answer += 'L'
else:
coordinate_r[0] = target_cord[0]
coordinate_r[1] = target_cord[1]
answer += 'R'
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
[ 배운 것 ]
1. abs(): 메소드(절대값, absolute value)
# 참고: https://www.programiz.com/python-programming/methods/built-in/abs
2. 처음에 구현 당시 거리만 멀면 될 줄 알고 abs()를 이용한 거리 즉, 맨하탄 거리가 아닌 Squared 거리를 이용했는데... 이러면 test case 13~20까지 실패한다... 문제에서 요구한 조건을 잘 따라야 겠다.
3. 이 문제도 dictionary를 통해 key pad의 번호와 좌표를 저장하니 코드가 좌표를 계산하는 for문이 하나 줄었고 아래 조건문에서 훨씬 간결한 것을 확인 했다. 하지만 구조 자체는 비슷하게 잡았기 때문에 만족스러운 풀이었다.
[ 개인적인 만족도 ]
(수달 1~5마리)
수달: 4마리!
꾸준히 열심히!
'Otter's [ 개발새발 ] > # 코딩테스트 - Programmers' 카테고리의 다른 글
| [Programmers 코딩테스트 연습_Lv1_Python] 없는 숫자 더하기 (0) | 2022.06.03 |
|---|---|
| [Programmers 코딩테스트 연습_Lv1_Python] 내적 (0) | 2022.06.03 |
| [Programmers 코딩테스트 연습_Lv1_Python] 숫자 문자열과 영단어 (0) | 2022.06.03 |
| [Programmers 코딩테스트 연습_Lv1_Python] 신규 아이디 추천 (0) | 2022.05.31 |
| [Programmers 코딩테스트 연습_Lv1_Python] 로또의 최고 순위와 최저 순위 (0) | 2022.05.31 |