본문 바로가기
자료구조 & 알고리즘

프로그래머스 키패드 누르기 - 자바스크립트 풀이

by PARADISE247 2024. 10. 20.
반응형

눌러야 하는 버튼과 현재 두 손가락의 위치 사이의 거리를 맨해튼 거리를 이용해 풀이했다.

맨해튼 거리 참고글 

 

맨해튼 거리 Manhattan distance

맨해튼 거리 Manhattan distance택시 기하학이라고도 불리며 기하학 중 하나이다.두 좌표 사이의 거리를 구하는 공식으로 사용된다.두 좌표 (p1,p2)과 (q1,q2) 사이의 거리면 |p1−q1|+|p2−q2|이다. 두 좌

fe-paradise.tistory.com

 

맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작한다. 이때 *는 10, #는 12로 보자. 거리를 구하기 위해 해당 키를 숫자로 간주해야 한다. 또한 키 "0"의 경우는 11로 간주하여 문제를 풀이하는 것이 쉽다. 풀이 코드는 다음과 같다.

function solution(numbers, hand) {
    let curr = {left: 10, right: 12};
    
    const answer = numbers.reduce((acc, cur, i) => { // reduce 사용
        if(cur === 0) cur = 11; // 키 0을 11로 보자
        const remainder = cur % 3;
        
        if(remainder === 0 && cur !== 11) { // 키 3,6,9
            acc.push("R");
            curr.right = cur;
        }
        else if(remainder === 1) { // 키 1,4,7
            acc.push("L");
            curr.left = cur;
        }
        else { // 키 2,5,8,0
            const x = (val) => Math.floor((val - 1) / 3); // x 좌표 구하기 함수
            const y = (val) => Math.floor((val - 1) % 3); // y 좌표 구하기 함수
            const left = Math.abs(x(cur) - x(curr.left)) + Math.abs(y(cur) - y(curr.left)); // 왼쪽 손가락 위치부터 눌러야하는 키까지의 거리
            const right = Math.abs(x(cur) - x(curr.right)) + Math.abs(y(cur) - y(curr.right)); // 오른쪽 손가락 위치부터 눌러야하는 키까지의 거리

            if(left > right) { // 왼손가락이 오른손가락보다 가까운 경우
                acc.push("R");
                curr.right = cur;
            } else if (left < right){ // 오른손가락이 왼손가락보다 가까운 경우
                acc.push("L");
                curr.left = cur;
            } else { // 양쪽손가락과 눌러야하는 키까지의 거리가 같은 경우
                acc.push(hand === "left"? "L" : "R"); // 왼손잡이인지 오른손잡이인지에 따라 결정
                curr[hand] = cur;
            }
        }
        return acc;
    },[]).join(""); // 문자열로 변환
    
    
    return answer;
}

 

 

반응형