[Python/Javascript] 프로그래머스 2020 카카오 인턴십 : 키패드 누르기

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

 

프로그래머스

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

programmers.co.kr

Python Answer

def solution(numbers, hand):
    answer = ''
    keypad = {
        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]
    }
    # 초반 손의 위치 설정
    leftPos = keypad['*']
    rightPos = keypad['#']
    
    leftKey = [1, 4, 7]
    rightKey = [3, 6, 9]
    for idx in range(len(numbers)):
        if numbers[idx] in leftKey:
            answer += 'L'
            leftPos = keypad[numbers[idx]]
        elif numbers[idx] in rightKey:
            answer += 'R'
            rightPos = keypad[numbers[idx]]
        else:
            rightDis = abs(rightPos[0] - keypad[numbers[idx]][0]) + abs(rightPos[1] - keypad[numbers[idx]][1])
            leftDis = abs(leftPos[0] - keypad[numbers[idx]][0]) + abs(leftPos[1] - keypad[numbers[idx]][1])
            if rightDis > leftDis:
                answer += 'L'
                leftPos = keypad[numbers[idx]]
            elif rightDis < leftDis:
                answer += 'R'
                rightPos = keypad[numbers[idx]]
            else: # 양손에서부터의 길이가 같은 경우
                if hand == 'right':
                    answer += 'R'
                    rightPos = keypad[numbers[idx]]
                else:
                    answer += 'L'
                    leftPos = keypad[numbers[idx]]
    return answer

 

Javascript Answer

function solution(numbers, hand) {
    var answer = '';
    keypad = {
        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]
    }
    
    var leftPos = keypad['*']
    var rightPos = keypad['#']
    
    leftKey = [1, 4, 7]
    rightKey = [3, 6, 9]
    
    for (var idx = 0; idx < numbers.length; idx++) {
        if (leftKey.includes(numbers[idx])) {
            answer += 'L'
            leftPos = keypad[numbers[idx]]
        } else if (rightKey.includes(numbers[idx])) {
            answer += 'R'
            rightPos = keypad[numbers[idx]]
        } else {
            var leftDis = Math.abs(leftPos[0] - keypad[numbers[idx]][0]) + Math.abs(leftPos[1] - keypad[numbers[idx]][1])
            var rightDis = Math.abs(rightPos[0] - keypad[numbers[idx]][0]) + Math.abs(rightPos[1] - keypad[numbers[idx]][1])
            
            if (rightDis < leftDis) {
            answer += 'R'
            rightPos = keypad[numbers[idx]]
        } else if (rightDis > leftDis) {
            answer += 'L'
            leftPos = keypad[numbers[idx]]
        } else {
            if (hand == 'right') {
                answer += 'R'
                rightPos = keypad[numbers[idx]]
            } else {
                answer += 'L'
                leftPos = keypad[numbers[idx]]
            }
        }
        }
        
    }
    return answer;
}

 

풀이 자체는 유사하다. 2,5,8,0과 같이 양손으로부터 길이를 구해줘야 하는 경우만 절댓값 계산을 통해 각 손에서부터 버튼의 거리를 구하고자 했다.

TAGS.

Comments