[JavaScript]キーボードを押す


プログラマコードテスト練習問題


これは、2020年のKACA実習コードテストで発生した問題です.
162題を見て、二次元配列にインデックスを使えばいいと思ったので、電話のキーボードを二次元配列に変えてreduce関数を使って文字列を返す形でコードを書きました.
function solution(numbers, hand) {
    const phone = [
        [1,2,3],
        [4,5,6],
        [7,8,9],
        ['*',0,'#']];
    
    let left = [3,0];	// 왼손의 첫 인덱스
    let right = [3,2];	// 오른손의 첫 인덱스
    let tmp = [0,0];	// numbers의 현재 item의 인덱스를 담을 배열

    return numbers.reduce((result,item) => {      
        let numIndex;	// 내부배열에 인덱스 값을 담을 변수
      
        for(let i=0; i<phone.length;i++){
            numIndex = phone[i].indexOf(item); // indexOf()함수로 현재 요소가 들어있는 내부배열을 찾는다.
            if(numIndex > -1){ // indexOf()함수는 배열내에 찾는 요소가 없을 시, -1을 반환한다.
                tmp[0]=i;	// 요소를 찾은 배열의 인덱스
                tmp[1]=numIndex; // 내부배열의 요소의 인덱스
                break;
            }
        }

        switch(numIndex){	
            case 0:		// 요소가 1,4,7 이면 내부배열에서의 인덱스는 0.
                result += 'L';	// 누적값에 'L'을 담는다.
                left = [...tmp];// 스프레드 연산자를 이용해 왼손의 인덱스를 현재 요소의 인덱스로 바꿔준다.
                break;
                
            case 2:		// 요소가 3,6,7 이면 내부배열에서의 인덱스는 2.
                result += 'R';
                right = [...tmp];
                break;
                
            default:		// 나머지 요소들은 왼손과 오른손의 위치를 비교하고 선택.
            			// 왼손과 오른손의 인덱스와 현 요소의 인덱스를 연산하고, 절대값으로 만들어
            			// 더해 왼손과 오른손의 인덱스에서 현 요소의 인덱스까지의 거리를 구함.
                const leftCnt = Math.abs(left[0]-tmp[0]) + Math.abs(left[1]-tmp[1]);
                const rightCnt = Math.abs(right[0]-tmp[0]) + Math.abs(right[1]-tmp[1]);

                if(leftCnt > rightCnt){
                    result += 'R';
                    right = [...tmp];
                }else if(leftCnt === rightCnt){ // 만약 거리가 같다면,
                    result += hand[0].toUpperCase(); // hand의 앞글자를 대문자로 바꿔서 누적값에 담는다.
                    hand === 'right' ? right=[...tmp] : left=[...tmp];
                }else{
                    result += 'L';
                    left = [...tmp];
                }
        }
        return result;
    },'');
}
  • 結果