문제 설명
스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.
제한 사항
입출력 예
numbers | hand | result |
---|---|---|
[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" |
[출처] 프로그래머스(https://programmers.co.kr/learn/courses/30/lessons/67256)
function solution(numbers, hand) { function getDistance(start, target) { return Math.abs(start[0]-target[0]) + Math.abs(start[1]-target[1]) } const keypad = { 1:[0,3],2:[1,3],3:[2,3], 4:[0,2],5:[1,2],6:[2,2], 7:[0,1],8:[1,1],9:[2,1], '*':[0,0],0:[1,0],'#':[2,0], } let answer = '' let left = keypad['*'] let right = keypad['#'] for(let i=0; i<numbers.length; i++){ if (numbers[i] === 1 || numbers[i] === 4 || numbers[i] ===7) { answer += 'L' left = keypad[numbers[i]] } else if (numbers[i] === 3 || numbers[i] === 6 || numbers[i] ===9) { answer += 'R' right = keypad[numbers[i]] } else { const distanceOfLeft = getDistance(left, keypad[numbers[i]]) const distanceOfRight = getDistance(right, keypad[numbers[i]]) if(distanceOfLeft<distanceOfRight) { answer += 'L' left = keypad[numbers[i]] } else if(distanceOfLeft>distanceOfRight) { answer += 'R' right = keypad[numbers[i]] } else if(hand==='left'){ answer += 'L' left = keypad[numbers[i]] } else { answer += 'R' right = keypad[numbers[i]] } } } return answer }
키패드와 동일하게 각 숫자에 맞는 좌표를 설정해서 누르려는 숫자와 현재 손가락 위치를 비교하는 방식으로 답을 구하였다. 처음에 좌표 값이 저장되어 있는 keypad 객체를 생성하는 방법 대신에 더 간단한 방식이 있지 않을까 고민했었는데 다른 방식을 생각해보니 시간복잡도도 차이가 없고 오히려 알아보기 어려워서 직관적인 방법으로 코드를 작성하게 되었다.