Algorithm/코딩테스트 연습
[프로그래머스] 키패드 누르기
yennle
2022. 1. 12. 15:09
728x90
https://programmers.co.kr/learn/courses/30/lessons/67256
코딩테스트 연습 - 키패드 누르기
[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"
programmers.co.kr
<문제 설명>
왼손 엄지와 오른손 엄지로 키패드의 숫자를 입력하려고 한다.
왼손 엄지는 '*'에서 시작, 오른손 엄지는 '#'에서 시작하며, 규칙은 다음과 같다.
① 상하좌우로 이동할 수 있으며, 한 칸이 거리로 1이다.
② 1, 4, 7 -> 왼손
③ 3, 6, 9 -> 오른손
④ 2, 5, 8, 0 -> 현재 더 가까운 손. 거리가 같으면 오른손잡이는 오른손, 왼손잡이는 왼손이 이동
<문제 이해>
거기를 재야하기 때문에 좌표로 접근하는 것이 좋을 것이라 생각했고,
3으로 나눴을 때의 몫과 나머지를 좌표에 이용하고자 하였다.
<문제 풀이>
def solution(numbers, hand):
answer = ''
posL = [3,1] # 왼손의 시작좌표. '*'의 좌표
posR = [3,3] # 오른손의 시작좌표. '#'의 좌표
nextH = '' # 다음 손
for num in numbers:
x = num // 3 if num % 3 != 0 else num//3-1 # x좌표. 3으로 나눴을 때의 몫. 3의 배수일 경우 몫-1
y = num % 3 if num % 3 != 0 else 3 # y좌표. 3으로 나눴을 때의 나머지. 3의 배수일 경우 3
if num == 0 : x = 3; y = 2 # 숫자가 0일 경우. 0의 좌표 (3,2)
if y == 1: nextH = 'L' # 1, 4, 7 일 경우, 왼손
elif y == 3: nextH = 'R' # 3, 6, 9 일 경우, 오른손
else: # 2, 5, 8, 0일 경우
diffL = abs(posL[0]-x) + abs(posL[1]-y) # 왼손과의 거리
diffR = abs(posR[0]-x) + abs(posR[1]-y) # 오른손과의 거리
if diffL < diffR: nextH = 'L' # 왼손이 더 가까울 때, 왼손
elif diffL > diffR: nextH = 'R' # 오른손이 더 가까울 때, 오른손
else: # 왼손과 오른손의 거리 같을 때
if hand[0].upper() == "L": nextH = 'L' # 왼손잡이면, 왼손
else: nextH = 'R' # 오른손잡이면, 오른손
if nextH == "L": answer += "L"; posL = [x, y] # answer추가, 손위치 변경
else : answer += "R"; posR = [x,y]
return answer
아주 오래걸렸다,, 머리도 안돌아가고,,,,
코드가 너무 길어서 이게 맞나,,,,싶고,,,,,,ㅋㅋㅋㅋㅋ
이것도 그나마 정리 좀 한거다,,
728x90