반응형
문제설명
https://programmers.co.kr/learn/courses/30/lessons/67256
사고과정
- 우선 주어지는 키패드 좌표를 2차원 배열로 나타내었다. 이유는 키패드 간의 거리를 계산하기 위해서. 거리 계산할 때는 맨해튼 거리 기법을 사용했다. 주어진 거리가 1이라고 해서 맨해튼 거리를 적용할 수 있었다.
- 한 가지 중요한 점은 find_xy라는 target 값이 주어졌을 때, 키패드에서 target 값을 찾는 함수를 정의해서 사용했다.
- 그리고 초기좌표를 왼손은 *, 오른손은 #이 있는 좌표로 설정해주고 1,4,7이면 무조건 왼손으로 결과값을 추가한 다음 find_xy 함수를 사용해 왼손의 위치 좌표를 업데이트시켜준다. 3,6,9일 때는 오른손을 사용해야 하므로 이도 마찬가지로 적용
- 그리고 2,5,8,0일 경우에는 target 값의 좌표를 우선 찾은 다음, 현재 왼손, 오른손 위치와 각각 거리를 잰 후 왼손거리가 더 작으면 왼손을 결과값으로 추가한 후 왼손의 위치를 target 값 좌표로 업데이트 시켜준다. 만약 오른손 거리가 더 작으면 오른손을 업데이트
- 만약 둘 거리가 같다면 문제에서 주어지는 왼손 또는 오른손잡이 hand 변수에 따라 결과값 추가해주고 해당 손의 위치를 target 좌표로 업데이트 해주면 됨!
풀이
arr = [[1,2,3],[4,5,6],[7,8,9],['*',0,'#']]
def find_xy(target):
for i in range(len(arr)):
for j in range(len(arr[0])):
if arr[i][j] == target:
x, y = i, j
return x, y
def solution(numbers, hand):
# 초기 왼손, 오른손 위치
left = (3, 0)
right = (3, 2)
answer = ''
for num in numbers:
# 1,4,7일 경우 -> 왼손 사용 & 왼손 위치 업데이트
if num in [1,4,7]:
left = find_xy(num)
answer += 'L'
# 3,6,9일 경우 -> 오른손 사용 & 오른손 위치 업데이트
elif num in [3,6,9]:
right = find_xy(num)
answer += 'R'
# 2,5,8,0일 경우
else:
# num의 좌표 찾기
t_x, t_y = find_xy(num)
# 현재 왼손, 오른손과의 거리 비교
left_dist = abs(left[0]-t_x) + abs(left[1]-t_y)
right_dist = abs(right[0]-t_x) + abs(right[1]-t_y)
if left_dist < right_dist:
left = t_x, t_y
answer += 'L'
elif right_dist < left_dist:
right = t_x, t_y
answer += 'R'
else:
if hand == 'left':
left = t_x, t_y
answer += 'L'
else:
right = t_x, t_y
answer += 'R'
return answer
반응형
'알고리즘 삽질장' 카테고리의 다른 글
[프로그래머스] 없는 숫자 더하기 (0) | 2021.12.07 |
---|---|
[프로그래머스] 크레인 인형뽑기 게임 (0) | 2021.12.07 |
[프로그래머스] 숫자 문자열과 영단어 (0) | 2021.12.06 |
[프로그래머스] 신규 아이디 추천 (0) | 2021.12.06 |
[프로그래머스] 로또의 최고 순위와 최저 순위 (0) | 2021.12.06 |