알고리즘 공부/프로그래머스

(Python)프로그래머스 코딩테스트 연습 - 2020 카카오 인턴십 - 키패드 누르기

HRuler 2021. 11. 11. 19:54

1. 문제

https://programmers.co.kr/learn/courses/30/lessons/67256?language=python3

 

코딩테스트 연습 - 키패드 누르기

[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

2. 나의 풀이

def solution(numbers, hand):
    answer = ''
    left = '10'
    right = '12'
    for number in numbers:
        # print('number :', number)
        L = int(left)
        R = int(right)
        if L == 0:
            L = 11
        if R == 0:
            R == 11
        if number == 1 :
            left = '1'
            answer += 'L'
        elif number == 4 :
            left = '4'
            answer += 'L'
        elif number == 7 :
            left = '7'
            answer += 'L'
        elif number == 3 :
            right = '3'
            answer += 'R'
        elif number == 6 :
            right = '6'
            answer += 'R'
        elif number == 9 :
            right = '9'
            answer += 'R'
        elif number == 2 or number == 5 or number == 8 or number == 0:
            if number == 0:
                number = 11
            if distance(number, L) == distance(number, R):
                if hand == 'left':
                    left = str(number)
                    answer += 'L'
                elif hand == 'right':
                    right = str(number)
                    answer += 'R'
            elif distance(number, L) < distance(number, R):
                # print('distance(number, L) :', distance(number, L))
                # print('distance(number, R) :', distance(number, R))
                left = str(number)
                answer += 'L'
            else:
                right = str(number)
                answer += 'R'
        # print('left : ' + left)
        # print('right : ' + right)
    return answer

def distance(first, second):
    result = 0
    if first != second:
        dis_val = abs(first - second)
        result = (dis_val // 3) + (dis_val % 3)
    return result

3. 다른 사람 풀이

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