[python_파이썬_2020 카카오 인턴십]프로그래머스_LV1_키패드 누르기_풀이

2024. 6. 19. 21:33코드리뷰

728x90
반응형

공부하는허딩크 : https://www.youtube.com/live/7MBqIbjFSrs?feature=shared

 

와.. 딱 50분 걸렸다. 물론 좀 무식한 방법밖에 생각나지 않아서 비효율적인 것 같지만...

그래도 이제는 시간이 좀 걸리더라고 혼자 고민하면서 해결할 수 있는 것 같아 재미가 느껴진다.

 

<첫번째 시도 : 맞았습니다.>

기본적으로 왼쪽[1, 4, 7]과 오른쪽[3, 6, 9]는 값이 정해진 것이다.

단, 가운데 2, 5, 8, 0을 어떻게 처리하는지에 대한 문제다.

그걸 place 딕셔너리를 만들어서 숫자판을 배열로 만들었을 경우 x, y값의 차이가 거리로 볼 수 있는 것을 찾아내었다.

※[[1, 2, 3]. [4, 5, 6], [7, 8, 9], [*, 0, #]] 의 배열이 주어졌을 경우 각 요소들의 x, y값을 쉽게 구할 수 있으면 굳이 딕셔너리를 사용할 필요는 없지만 아직 내 머리에는 그런 지식이 없다.

def solution(numbers, hand):
    answer = ''
    L = [1, 4, 7]
    R = [3, 6, 9]
    left = '*'
    right = '#'
    place = {
        1 : "00",
        2 : "01",
        3 : "02",
        4 : "10",
        5 : "11",
        6 : "12",
        7 : "20",
        8 : "21",
        9 : "22",
        '*' : "30",
        0 : "31",
        "#" : "32"
    }
    for i in numbers:
        if i in L:
            answer += 'L'
            left = i
        elif i in R:
            answer += 'R' #if와 elif를 다시한번 정리해보자.
            right = i
        else:
            x, y = place[i]
            rx, ry = place[right]
            lx, ly = place[left]
            rightside = abs(int(ry) - int(y)) + abs(int(rx) - int(x))
            leftside = abs(int(ly) - int(y)) + abs(int(lx) - int(x))
            if rightside > leftside:
                answer += 'L'
                left = i
            elif rightside < leftside:
                answer += 'R'
                right = i
            else:
                if hand == "right":
                    answer += 'R'
                    right = i
                if hand == "left":
                    answer += 'L'
                    left = i
    return answer

 

<기본 문법 복습>

if

if 이렇게 사용하는 것은 각 if조건문이 독립적으로 검사가 된다.

즉, 위에 코드에서 elif를 if로 변경했을 경우 i가 L에 있다고 하더라도 두번째 if에서 또 검사가 된다.

                                                                               

if

elif 이렇게 사용하는 것은 if가 거짓일 경우에만 elif로 넘어간다.

 

<다른사람 풀이 참조>

1. 가장 좋아요를 많이 받은 답과 100%일치함 : 변수명만 조금 다름 => 자신감 뿜뿜!!!!

   ㄴ 추가적으로 딕셔너리 만들때 1 : "00" 이 아니라 1 : (0, 0) 이렇게 해도 됨.

2. 이것도 효율적임. :  0부터 9까지의 위치값을 순서대로 배열로 만든 후 계속 위치값으로 움직임.

     ㄴ hand[0].upper()도 한번 지나치듯 생각해본 건데 그대로 사용됨.

     ㄴ location[i][0]을 통해서 순서대로 배치한 배열을 그대로 활용할 수 있는 부분이 인상적임.

def solution(numbers, hand):
    answer = ''
    location = [[3, 1], [0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]]
    left, right = [3, 0], [3, 2]
    for i in numbers:
        if i % 3 == 1:
            answer += 'L'
            left = location[i]
        elif i % 3 == 0 and i != 0:
            answer += 'R'
            right = location[i]
        else:
            l = abs(location[i][0] - left[0]) + abs(location[i][1] - left[1])
            r = abs(location[i][0] - right[0]) + abs(location[i][1] - right[1])
            if l < r:
                answer += 'L'
                left = location[i]
            elif l > r:
                answer += 'R'
                right = location[i]
            else:
                answer += hand[0].upper()
                if hand == 'right':
                    right = location[i]
                else:
                    left = location[i]                

    return answer
728x90
반응형