728x90
<문제 링크>
https://programmers.co.kr/learn/courses/30/lessons/67256
<문제 풀이>
1. 키패드의 좌표를 변수로 지정한다
2. 왼쪽, 오른쪽 시작 위치를 *, #으로 지정한다
3. 1,4,7일 때는 왼손, 3,6,9일 때는 오른손을 출력한다
4. 이외 숫자를 누를 때는 현재 양쪽 손의 거리(손좌표x-숫자좌표x) + (손좌표y-숫자좌표y)를 절대값으로 구해서 더 가까운 손으로 출력한다.
5. 4번 값이 동일하다면 왼손잡이, 오른손잡이로 출력한다.
<코드>
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)}
lhand = '*'
rhand = '#'
for i in numbers:
if i in [1,4,7]:
answer += 'L'
lhand = i
elif i in [3,6,9]:
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
<고쳐야 할 점>
- (x1,y1)와 (x2,y2)가 상하좌우로만 움직일 수 있을 때, 거리는 abs(x1-x2)+abs(y1-y2)로 구한다
- 복습 알고리즘
'두두의 알고리즘 > 문제' 카테고리의 다른 글
[해시] 프로그래머스 L1 '신고 결과 받기' (Python) (0) | 2022.03.20 |
---|---|
[탐욕법] 프로그래머스 L1 '신규 아이디 추천' (Python) (0) | 2022.03.20 |
[진법 변환] 프로그래머스 L1 '3진법 뒤집기' (Python) (0) | 2022.03.20 |
[순열과 조합] 프로그래머스 L1 '두 개 뽑아서 더하기' (Python) (0) | 2022.03.20 |
[탐욕법] 프로그래머스 L1 '최소직사각형' (Python) (0) | 2022.03.20 |