코린이의 개발 일지

[파이썬 코딩테스트] 키패드 누르기 - 2020 카카오 인턴십 본문

파이썬 코딩테스트 연습

[파이썬 코딩테스트] 키패드 누르기 - 2020 카카오 인턴십

폴라민 2022. 1. 10. 00:09
반응형

안녕하세요 폴라민입니다.

이번에는 2020 카카오 인턴십 코테 문제를 가지고 와 봤습니다. 

 

이번 포스팅에는 문제에 대한 해답이 나와있으므로 아직 문제를 풀어보지 않으신 분들은 프로그래머스 혹은 백준 사이트에서 문제를 풀어보고 오시는 것을 권장드립니다.

 

https://programmers.co.kr/learn/challenges

 

코딩테스트 연습

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

 

 

그럼 시작해 볼까요?

 

이번 문제도 차근차근 접근하기만 했다면 크게 어렵지는 않았습니다.

우선 제 코드를 한번 볼까요?

 

def solution(numbers, hand):
    phone_num=[[1,4,7,'*'],[2,5,8,0],[3,6,9,'#']]
    left_thumb=[0,3]
    right_thumb=[2,3]
    answer = ''
    for num in numbers:
        if num in phone_num[0]:
            answer+="L"
            left_thumb=[0,num//3]
        elif num in phone_num[2]:
            right_thumb=[2,num//3-1]
            answer+="R"
        else:
            if num==0:
                num_idx=3
            else:
                num_idx=num//3
            L_distance=(1-left_thumb[0])+abs(left_thumb[1]-num_idx)
            R_distance=(right_thumb[0]-1)+abs(right_thumb[1]-num_idx)
            if L_distance > R_distance:
                answer+="R"
                right_thumb=[1,num_idx]
            elif L_distance < R_distance:
                answer+="L"
                left_thumb=[1,num_idx]
            else:
                if hand == "left":
                    answer+="L"
                    left_thumb=[1,num_idx]
                else:
                    answer+="R"
                    right_thumb=[1,num_idx]
    return answer

 

저는 먼저 숫자 패드를 2차원 배열로 표현해 주었습니다. 

[[1,2,3],[4,5,6]....

이런식으로 만들까 하다가 위와 같이 표현하는게 다루기 편할 거 같아 

phone_num=[[1,4,7,'*'],[2,5,8,0],[3,6,9,'#']]

이런식으로 표현을 해주었습니다.

 

그리고 왼손 엄지, 오른손 엄지의 위치를 나타내주는 배열을 각각 변수에 저장해두었습니다.

 

이제 우리는 위치에 따라 엄지의 위치를 바꿔 주고 answer에 'L' 혹은 'R'을 집어 넣어주기만 하면 됩니다.

사실 숫자가 1,4,7 이거나 3,6,9 일때는 쉽죠. 각각 왼손, 오른손 을 움직여 주면 되니까요.

문제는 가운데에 있는 숫자 2,5,8,0입니다.

 

이것도 차근차근 생각하면 어렵지 않습니다. 

우선 1. 입력할 숫자의 위치와 왼손 엄지, 오른손 엄지 사이 거리를 비교해줍니다.

2. 거리가 다를 경우 더 가까이 있는 엄지를 움직여 줍니다.

3. 거리가 같을 경우 hand매개변수를 고려해 줍니다.

 

이렇게만 해주면 되죠.

 L_distance=(1-left_thumb[0])+abs(left_thumb[1]-num_idx)
 R_distance=(right_thumb[0]-1)+abs(right_thumb[1]-num_idx)

우선 위와 같이 숫자의 위치에서 왼손 엄지까지 거리, 오른손 엄지까지 거리를 계산해 줍니다.

 

거리를 비교하여 왼손이 더 가까울 경우 왼손 엄지를 움직여 주고, 오른손이 더 가까우면 오른손 엄지를 움직여 줍니다.

 

그리고 만약 거리가 같을 경우 hand의 값이 "left"일 경우와 "right"일 경우를 구분하여 엄지를 움직여 주면 됩니다.

이렇게 차근차근 해보니 막상 그렇게 어렵지는 않죠?

 

저는 이차원 배열로 키패드를 표현 했지만 다른 분들 풀이를 보니

key_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)}

 

이런식으로 딕셔너리로 표현하신 분들도 있더군요. 확실히 key와 value로 구분하여 다룰 수 있는 자료형이니 더 깔끔해보입니다. 다른 분들의 풀이도 참고하시면 더 깔끔하게 코드를 짜는 연습이 될 것 같아요.

 

그럼 이상으로 키패드 누르크 코테 문제 풀이를 마치도록 하겠습니다.

 

모두들 즐코~!!

반응형
Comments