Algorithm/알고리즘 문제
[프로그래머스][Python] 키패드 누르기
은 딩
2023. 10. 9. 15:20
https://school.programmers.co.kr/learn/courses/30/lessons/67256
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
아이디어
1,4,7이나 3, 6, 9를 누를 때는 왼손 오른손 구별하기가 너무나 쉬운데
2, 5, 8, 0을 누를 때는 어떻게 판별해야할지 감이 안왔다. 그래서 BFS로 풀어야 하나 하고 코드를 짜고 있었는데
뒤로가기 버튼을 잘못 눌러서 코드가 날라갔다... 후 다시 마음을 가다듬고 찾아봤더니 딕셔너리로 푸는 사람이 많았다.
(( 요즘 프로그래머스 문제를 풀면서 느낀 점은 리스트에서 find()든 index()든 시간복잡도가 O(n)으로 크기 떄문에 딕셔너리로 푸는 문제가 정말 많다. 딕셔너리로 풀면 시간을 줄일 수 있어서 너무 좋은 것 같다. 앞으로 딕셔너리로 쓰는 습관을 들여야겠다!!! ))
아무튼 먼저 딕셔너리에 키패드의 모든 좌표를 저장해주고
좌표 거리 계산은 절댓값으로 2차원 좌표니까 for문 돌면서 거리를 더해주면 된다.
이때 리스트 세개를 동시에 돌 거라서 for문에 zip을 써주었다.
그리고 맨 마지막에 왼손으로 눌렀는지 오른손으로 눌렀는지 판별해서 갱신 해주면 끝!!
코드
def solution(numbers, hand):
answer = ''
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]}
# 시작 위치
startL, startR = dict['*'], dict['#']
for num in numbers:
now = dict[num]
if num in (1, 4, 7): # Left
answer += 'L'
elif num in (3, 6, 9): # Right
answer += 'R'
else: # 2, 5, 8, 0
distance_L, distance_R = 0, 0
# 좌표 거리 계산
for a, b, c in zip(startL, startR, now):
distance_L += abs(a - c)
distance_R += abs(b - c)
if distance_L < distance_R:
answer += 'L'
elif distance_L > distance_R:
answer += 'R'
else: # 길이가 같다면
hand = hand.upper()
answer += hand[0]
if answer[-1] == 'L':
startL = now
else:
startR = now
return answer