level1 _ [2020 카카오 인턴십] 키패드 누르기

LOOPY·2022년 5월 6일
0

Programmers(연습문제)

목록 보기
62/63
function solution(numbers, hand) {
    let ans = "";
    let right = '#';
    let left = '*';
    let keypad = [{num:'*', row:3, col:0}, {num:0, row:3, col:1}, {num:'#', row:3, col:2}];
    for(let i=1; i<10; i++){
        keypad.push({num:i, row:Math.floor((i-1)/3), col:(i-1)%3});
    }

    numbers.forEach(number => {
        if(number%3 == 1){ // 1열(1, 4, 7)
            ans += "L";
            left = number;
        }else if(number%3 == 2 || number == 0){ // 2열(2, 5, 8, 0)
            let Lx = 0;
            let Ly = 0;
            let Rx = 0;
            let Ry = 0;
            // 누르고자 하는 곳의 좌표 저장
            for(let i=0; i<keypad.length; i++){
                if(keypad[i].num == number){ 
                    Lx = Rx = keypad[i].row;
                    Ly = Ry = keypad[i].col;
                    break;
                }
            }
            // 현재 엄지손가락의 좌표와 거리 계산
            for(let i=0; i<keypad.length; i++){
                if(keypad[i].num == left){
                    Lx = Math.abs(Lx - keypad[i].row);
                    Ly = Math.abs(Ly - keypad[i].col);
                    break;
                }
            }
            for(let i=0; i<keypad.length; i++){
                if(keypad[i].num == right){
                    Rx = Math.abs(Rx - keypad[i].row);
                    Ry = Math.abs(Ry - keypad[i].col);
                    break;
                }
            }
            // 움직일 손 결정
            if(Lx+Ly < Rx+Ry){
                ans += "L";
                left = number;
            }else if(Lx+Ly > Rx+Ry){
                ans += "R";
                right = number;
            }else{
                if(hand == "left"){
                    ans += "L";
                    left = number;
                }else{
                    ans += "R";
                    right = number;
                }
            }
        }else{ // 3열(3, 6, 9)
            ans += "R";
            right = number;
        }
    })
    
    return ans;
}

꼼꼼히 손코딩하며 생각해본 후에 작성해 그나마 시간이 덜 걸린 것 같다. ans와 left를 저장하는 부분에서 반복되는 코드들이 조금씩 있어 신경 쓰이지만 함수로 빼려면 forEach 내부에서 인덱스를 다시 가져와야하기 때문에 그냥 두기로😔 이번주말 우테캠 코테에서도 이정도 스퍼트만 나와주길!

profile
2년차 프론트엔드 개발자의 소소한 기록을 담습니다 :-)

0개의 댓글

관련 채용 정보