본문 바로가기
코딩 테스트

[카카오][Python] 키패드 누르기

by 카프리썬 2021. 7. 9.
728x90

아래의 문제는 카카오 채용 코딩테스트 내용이며 코드는 직접 푼 내용입니다.


키패드누르기

문제상황

요구사항

순서대로 누를 번호가 담긴 배열 numbers,

왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때,

각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는

연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.

 

제한사항

  • numbers 배열의 크기는 1 이상 1,000 이하입니다.
  • numbers 배열 원소의 값은 0 이상 9 이하인 정수입니다.
  • hand는 "left" 또는 "right" 입니다.
    • "left"는 왼손잡이, "right"는 오른손잡이를 의미합니다.
  • 왼손 엄지손가락을 사용한 경우는 L, 오른손 엄지손가락을 사용한 경우는 R을 순서대로 이어붙여 문자열 형태로 return 해주세요.

입출력


풀이과정

1. 입력한 숫자 : 1,4,7 => 왼손선택,  결과 : L -> 왼손위치가 현재누른 숫자로 바뀜

2. 입력한 숫자 : 3,6,9 => 오른손선택 , 결과 : R -> 오른손위치가 현재누른 숫자로 바뀜

3. 입력한 숫자 : 그외일때 거리를 구한다 => 어떻게 거리를 구할것인가?

3-1.입력한 숫자와 왼손위치의 거리 vs 입력한 숫자와 오른손위치의 거리

- 왼쪽거리가 더 짧으면 왼손선택, 결과 : L -> 왼손위치가 현재누른 숫자로 바뀜

- 오른손거리가 더 짧으면 오른손선택, 결과 : R -> 오른손위치가 현재누른 숫자로 바뀜

- 거리가 같으면, 누른손에 따라 결과 선택

    - 오른손이라면,  오른손선택, 결과 : R -> 오른손위치가 현재누른 숫자로 바뀜

    - 왼손이라면, 왼손선택, 결과 : L -> 왼손위치가 현재누른 숫자로 바뀜

 

요구사항에 따라서 IF문을 잘 나누기만 하면된다.

처리하는 작업이 반복되는게 많다.

 

아마 여기에서 어려웠던건 어떻게 거리를 구할것인지였다.

키패드를 좌표로 바꿔야겠다는 아이디어가 필요했다.

그리고 좌표상의 거리를 구한다.  |x1-x2| + |y1-y2|

결과

내가 푼 정답코드결과

keypad={
    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)
}
def distance(l,r,n):
    left_x,left_y = keypad[l][0],keypad[l][1]
    right_x,right_y = keypad[r][0],keypad[r][1]
    n_x,n_y = keypad[n][0],keypad[n][1]

    left_dist=abs(left_x-n_x)+abs(left_y-n_y)
    right_dist=abs(right_x-n_x)+abs(right_y-n_y)

    return left_dist,right_dist
    
def solution(numbers, hand):
    answer = ''
    left='*'
    right='#'

    for n in numbers:
        #print(left,right,n)
        if n in [1,4,7]:
            answer=answer+"L"
            left=n
        elif n in [3,6,9]:
            answer=answer+"R"
            right=n 
        else: #거리가 더 작은쪽을 선택
            #left-n vs right-n 거리비교
            ld,rd=distance(left,right,n)
            if ld<rd: #왼쪽거리가 더 짧으면 왼손을 선택
                answer=answer+"L"
                left=n
            elif ld>rd: #오른쪽거리가 더 짧으면 오른손을 선택
                answer=answer+"R"
                right=n 
            elif ld==rd: #비교한 거리가 같으면 hand를 따라감
                if hand=='right':
                    answer=answer+"R"
                    right=n #left는 이전꺼, right는 n
                elif hand=='left':
                    answer=answer+"L"
                    left=n #left는 n, right는 이전꺼
    return answer

 너무 중복되는 처리가 많아서 함수로 바꿀까도 했지만, 어차피 코드길이는 거의 차이가 없더라.

 

배운점

  • 뭔가 두 점의 거리를 구하려고 할땐, 좌표를 생각하자. 

반응형