https://school.programmers.co.kr/learn/courses/30/lessons/67256
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드
# 키패드 두 좌표 사이의 거리 함수
def len2(a, b):
return abs(a[0]-b[0]) + abs(a[1]-b[1])
def solution(numbers, hand):
answer = ''
left = [3, 0] # 왼쪽 손의 인덱스
right = [3, 2] # 오른쪽 손의 인덱스
for num in numbers:
# 1. 무조건 왼쪽 엄지로 누르는 경우
if num in [1, 4, 7]:
answer += 'L'
left = [(num-1) // 3, (num-1) % 3]
# 2. 무조건 오른쪽 엄지로 누르는 경우
elif num in [3, 6, 9]:
answer += 'R'
right = [(num-1) // 3, (num-1) % 3]
# 3. 둘 사이의 거리를 비교해야 하는 경우
else:
# 눌러야 하는 숫자의 인덱스 파악
if num == 0:
tmp = [3, 1]
else:
tmp = [(num-1) // 3, (num-1) % 3]
# 왼손, 오른손 중 어디가 더 가까운지
if len2(left, tmp) > len2(right, tmp):
answer += 'R'
right = tmp
elif len2(left, tmp) < len2(right, tmp):
answer += 'L'
left = tmp
else:
if hand == 'right':
answer += 'R'
right = tmp
else:
answer += 'L'
left = tmp
return answer
풀이
해당 문제의 전체적인 풀이법은 키패드를 2차원 배열로 생각하여 왼쪽 엄지 인덱스, 오른쪽 엄지 인덱스, 눌러야 할 키패드의 인덱스를 이용해 풀었다.
풀이를 찬찬히 살펴보자.
우선 왼손 엄지 인덱스와 오른손 엄지 인덱스의 초기값을 left, right에 할당해준다. 왼손은 [3행, 0열], 오른손은 [3행, 2열]에 있으므로 left = [3, 0], right = [3, 2]로 할당할 수 잇다.
이제 누를 번호가 담긴 배열 numbers을 for문을 돌면서 키패드를 눌러나간다.
가장 먼저 [1, 4, 7]번을 누를 경우 무조건 'L', [3, 6, 9]를 누를 경우 무조건 'R'이며 이 때 누른 엄지 방향 인덱스인 left, right를 갱신해주어야 한다. 이 때, 키패드 배열의 규칙을 찾고자 하였는데 0을 제외하고 행은 (키패드의 숫자-1)을 3으로 나눈 몫, 열은 (키패드의 숫자-1)을 3으로 나눈 나머지임을 알게 되었다. 따라서 해당 규칙을 내장함수를 이용하여 left, right를 갱신해준다.
마지막으로 left, right와 눌러야 하는 키패드의 숫자 인덱스까지의 거리가 같은 경우 둘 중 어느 거리가 가까운 지 확인해야 한다. 이를 위해 사용자 정의 함수 len2를 정의해주었고, 이는 차의 절댓값의 합을 이용한 맨하튼 거리를 리턴한다. 둘 중 거리가 가까운 쪽을 누르고, 그에 맞게 left와 right를 갱신해주면 된다. 만약 거리가 같은 경우 주어진 문제의 왼손잡이, 오른손잡이 조건에 따라 키패드를 누르고 left, right를 갱신해준다.
'Python > Coding Test' 카테고리의 다른 글
[백준] 1268 : 임시 반장 정하기 (1) | 2024.04.04 |
---|---|
[백준] 1439 : 뒤집기 (1) | 2024.03.07 |
[프로그래머스] 신규 아이디 추천 (0) | 2024.02.26 |
[프로그래머스] 숫자 문자열과 영단어 (0) | 2024.02.16 |
[프로그래머스] 신고 결과 받기 (0) | 2024.02.14 |