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