본문 바로가기
Otter's [ 개발새발 ]/# 코딩테스트 - Programmers

[Programmers 코딩테스트 연습_Lv1_Python] [카카오 인턴] 키패드 누르기

by byeonPig 2022. 6. 3.

주소: 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

[ 문제 ]

 

[ 나의 귀여운 풀이 ]

def solution(numbers, hand):
    answer = ''

    coordinate_l = [3, 0]
    coordinate_r = [3, 2]

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

    target_cord = [0, 0]

    for targetNum in numbers:

        for i in range(len(keyboard)):
            if targetNum in keyboard[i]:
                target_cord[0] = i
                target_cord[1] = keyboard[i].index(targetNum)

        if targetNum in [1, 4, 7]:
            coordinate_l[0] = target_cord[0]
            coordinate_l[1] = target_cord[1]

            answer += 'L'
            continue
        elif targetNum in [3, 6, 9]:
            coordinate_r[0] = target_cord[0]
            coordinate_r[1] = target_cord[1]
            answer += 'R'
            continue

        dist_l = abs(target_cord[0] - coordinate_l[0]) + abs(target_cord[1] - coordinate_l[1])
        dist_r = abs(target_cord[0] - coordinate_r[0]) + abs(target_cord[1] - coordinate_r[1])

        if dist_l > dist_r:
            coordinate_r[0] = target_cord[0]
            coordinate_r[1] = target_cord[1]
            answer += 'R'
        if dist_r > dist_l:
            coordinate_l[0] = target_cord[0]
            coordinate_l[1] = target_cord[1]
            answer += 'L'
        if dist_r == dist_l:
            if hand == 'left':
                coordinate_l[0] = target_cord[0]
                coordinate_l[1] = target_cord[1]
                answer += 'L'
            else:
                coordinate_r[0] = target_cord[0]
                coordinate_r[1] = target_cord[1]
                answer += 'R'


    return answer

 

[ 다른 분들의 유려한 코드 ]

def solution(numbers, hand):
    answer = ''
    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)}

    left = [1,4,7]
    right = [3,6,9]
    lhand = '*'
    rhand = '#'
    for i in numbers:
        if i in left:
            answer += 'L'
            lhand = i
        elif i in right:
            answer += 'R'
            rhand = i
        else:
            curPos = key_dict[i]
            lPos = key_dict[lhand]
            rPos = key_dict[rhand]
            ldist = abs(curPos[0]-lPos[0]) + abs(curPos[1]-lPos[1])
            rdist = abs(curPos[0]-rPos[0]) + abs(curPos[1]-rPos[1])

            if ldist < rdist:
                answer += 'L'
                lhand = i
            elif ldist > rdist:
                answer += 'R'
                rhand = i
            else:
                if hand == 'left':
                    answer += 'L'
                    lhand = i
                else:
                    answer += 'R'
                    rhand = i

    return answer

 

[ 배운 것 ]

 

1. abs(): 메소드(절대값, absolute value)

# 참고: https://www.programiz.com/python-programming/methods/built-in/abs

 

2. 처음에 구현 당시 거리만 멀면 될 줄 알고 abs()를 이용한 거리 즉, 맨하탄 거리가 아닌 Squared 거리를 이용했는데... 이러면 test case 13~20까지 실패한다... 문제에서 요구한 조건을 잘 따라야 겠다.

 

3. 이 문제도 dictionary를 통해 key pad의 번호와 좌표를 저장하니 코드가 좌표를 계산하는 for문이 하나 줄었고 아래 조건문에서 훨씬 간결한 것을 확인 했다. 하지만 구조 자체는 비슷하게 잡았기 때문에 만족스러운 풀이었다.

 

[ 개인적인 만족도 ]

(수달 1~5마리)

수달: 4마리!

 

꾸준히 열심히!