728x90
https://programmers.co.kr/learn/courses/30/lessons/67256
접근
딕셔너리를 활용하여 각 번호를 key, 번호의 좌표를 value로 저장한다.
이후 해당 번호에 따라서 왼손과 오른손의 좌표를 이동하고 조건에 따라 최종해에 L과 R을 추가한다.
이렇게 번호의 좌표를 딕셔너리에 저장한 이유는 2, 5, 8, 0일 때 더 가까운 손으로 눌러야하기 때문이다.
구현
- 일단 2차원 리스트인 board에 키패드의 모양대로 저장한다.
- 이제 board를 탐색하여 key_pos라는 딕셔너리에 번호를 key, 좌표를 value로 저장한다.
- 초기에 left, right에 왼손과 오른손의 위치를 저장하고
- 입력된 번호를 탐색한다.
- 1, 4, 7일 때는 answer에 L을 추가하고 left의 위치를 갱신한다.
- 3, 6, 9일 때는 answer에 R을 추가하고 right의 위치를 갱신한다.
- 위의 두 가지 조건이 아닐 때는 현재 나온 숫자와 왼손, 오른손들의 위치를 비교한다.
- 더 가까운 손을 answer에 추가하고 거리가 같을 때는 hand를 비교한다.
def solution(numbers, hand):
answer = ''
board = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
['L', 0, 'R']
]
key_pos = {}
for y in range(4):
for x in range(3):
key_pos[board[y][x]] = (y, x)
left = key_pos['L']
right = key_pos['R']
for number in numbers:
if number == 1 or number == 4 or number == 7:
answer += 'L'
left = key_pos[number]
elif number == 3 or number == 6 or number == 9:
answer += 'R'
right = key_pos[number]
# 2, 5, 8, 0 일때
else:
left_dist = abs(left[0] - key_pos[number][0]) + abs(left[1] - key_pos[number][1])
right_dist = abs(right[0] - key_pos[number][0]) + abs(right[1] - key_pos[number][1])
if left_dist < right_dist:
answer += 'L'
left = key_pos[number]
elif left_dist > right_dist:
answer += 'R'
right = key_pos[number]
else:
if hand == 'left':
answer += 'L'
left = key_pos[number]
else:
answer += 'R'
right = key_pos[number]
return answer
'알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글
[Level 2] 뉴스 클러스터링 (0) | 2021.08.29 |
---|---|
[Level 1] 실패율 (0) | 2021.08.03 |
[Level 1] 숫자 문자열과 영단어 (0) | 2021.07.31 |
[Level 2] 괄호 회전하기 (0) | 2021.06.15 |
[Level 3] 베스트 앨범 (0) | 2021.06.07 |