[파이썬/python] 프로그래머스 : [카카오 인턴] 키패드 누르기 (Lv.1)

https://school.programmers.co.kr/learn/courses/30/lessons/67256

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

def solution(numbers, hand):
    answer = ''
    left = (4,1)
    right = (4,3)
    keypad = [(4,2),(1,1),(1,2),(1,3),(2,1),(2,2),(2,3),(3,1),(3,2),(3,3)]
    left_key = [1,4,7]
    right_key = [3,6,9]
    ans = ""
    
    for i in numbers:
        r = abs(keypad[i][0]-right[0]) + abs(keypad[i][1]-right[1])
        l = abs(keypad[i][0]-left[0]) + abs(keypad[i][1]-left[1])
        if i in left_key:
            ans += "L"
            left = keypad[i]
        elif i in right_key:
            ans += "R"
            right = keypad[i]
        else:
            if r == l and hand == "right":
                ans += "R"
                right = keypad[i]
            elif r == l and hand == "left":
                ans += "L"
                left = keypad[i]
            elif l < r:
                ans += "L"
                left = keypad[i]
            else:
                ans += "R"
                right = keypad[i]
        
    return ans

 

각각 키패드의 좌표값을 정해준다음, 좌표끼리의 차의 절댓값을 더해 거리를 구해주었다

구해 준 거리를 비교하여 조건문을 작성하였다.

 

좋은 풀이인지는 모르겠으나 불과 몇 개월 전에 이 문제를 못 풀어서 끙끙대다 관뒀던 적이 있는데 오늘 다시 풀어보니 쉽게 풀어져서 약간 감격이었다

지금 보니 구현하는 거 자체는 되게 단순한 문제였다

지금 어려워서 풀면서 괴로운 문제도 나중에는 쉽게 풀 수 있겠지?ㅠㅠ 열심히 해야겠당

 

 

다른 사람 풀이

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

처음에 딕셔너리를 이용해서 푸는 방법도 생각했었는데 확실히 딕셔너리 쓰면 더 깔끔한 것 같다.

comment