[JavaScript] 키패드 누르기

Moonlog·2020년 12월 24일
0

Algorithm

목록 보기
3/3
post-thumbnail

프로그래머스 코딩테스트 연습문제

2020 카카오 인턴십 코딩테스트에 나왔던 문제라고 한다.
문제를 보고 2차원 배열에 인덱스를 이용하면 되겠구나 싶어 전화 키패드를 2차원 배열로 만들어주고 리듀스 함수를 사용하여 하나의 문자열을 반환하는 형태로 코드를 작성했다.

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;
    },'');
}
  • 결과
profile
Start 20.12.10 ~ ing

0개의 댓글

관련 채용 정보