프로그래머스 : 키패드 누르기 ( 2020 카카오 인턴십 )

KHW·2021년 6월 23일
0

알고리즘

목록 보기
28/37

문제
100/100
1시간10분 소요

기본적인 내용

키패드의 왼쪽라인은 왼쪽손으로 오른쪽라인은 오른손으로
중간은 해당 거리를 계산하여 가까운쪽으로 하되 둘다 같으면 hand배열을 통해 적용시킨다.

코드

function solution(numbers, hand) {
    let phone = [[1,2,3],[4,5,6],[7,8,9],['*',0,'#']];
    let rRight = 3 , cRight = 2 , rLeft = 3, cLeft= 0;
    let result = numbers.map(val=>{
        if(val%3 == 2 || val==0){
            let re;
            phone.map((arr,i)=>{
                arr.map((x,j)=>{
                    if(val == x){
                        let dif = (Math.abs((rRight-i)) + Math.abs((cRight-j))) - (Math.abs((rLeft-i)) + Math.abs((cLeft-j)))
                        console.log(dif)
                        if(dif > 0){    //L
                            rLeft = i;
                            cLeft = j;
                            re = 'L';
                        }
                        else if(dif < 0){       //R
                            rRight = i;
                            cRight = j;
                            re = 'R';
                        }
                        else{       //
                            if(hand[0] == 'r'){
                            rRight = i;
                            cRight = j;
                            }
                            else{
                               rLeft = i;
                                cLeft = j; 
                            }
                            re = hand[0].toUpperCase();
                        }

                    }
                })
            })
            return re;
        }
        else if(val%3 == 1){
            phone.map((arr,i)=>{
                arr.map((x,j)=>{
                    if(val == x){
                        rLeft = i;
                        cLeft = j;
                    }    
                })
            })
            return 'L';    
        }
        else if(val%3 == 0){
            phone.map((arr,i)=>{
                arr.map((x,j)=>{
                    if(val == x){
                        rRight = i;
                        cRight = j;
                    }    
                })
            })
            return 'R';
        }

    })
    return result.join('')
}
  1. 중간일때
    1) 차이가 양수일때
    2) 차이가 음수일때
    3) 차이가 0일때 => hand[0]이 'r'일때와 hand[0]이 'l'일때
  2. 왼쪽일때
  3. 오른쪽일때
 phone.map((arr,i)=>{
                arr.map((x,j)=>{
                    if(val == x){
                       ...
                    }    
                })
            })

위와 같은 구조를 자주 쓰는데 해당하는 i,j에서의 원하는 값 val이 해당 x와 같으면 그때의 i,j를 적용시킨다.

코드 간단화 하기

function returnLeft(i,j){
 return [i,j,'L']
}
function returnRight(i,j){
 return [i,j,'R']
}

function solution(numbers, hand) {
 let phone = [[1,2,3],[4,5,6],[7,8,9],['*',0,'#']];
 let rRight = 3 , cRight = 2 , rLeft = 3, cLeft= 0;
 let result = numbers.map(val=>{
     let num;
     if(val%3 == 2 || val==0)            //중간 위치 번호라면
     {
         phone.map((arr,i)=>{
             arr.map((x,j)=>{
                 if(val == x){
                     let dif = (Math.abs((rRight-i)) + Math.abs((cRight-j))) - (Math.abs((rLeft-i)) + Math.abs((cLeft-j)))
                     
                     if(dif > 0)[rLeft,cLeft,num] = returnLeft(i,j)
                     else if(dif < 0)[rRight,cRight,num] = returnRight(i,j)
                     else{      
                         if(hand[0] == 'l')[rLeft,cLeft,num] = returnLeft(i,j)
                         else[rRight,cRight,num] = returnRight(i,j)
                     }    
                 }
             })
         })
         return num;
     }
     else if(val%3 == 1){
         phone.map((arr,i)=>{
             arr.map((x,j)=>{
                 if(val == x)[rLeft,cLeft,num] = returnLeft(i,j)
             })
         })
         return num;    
     }
     else if(val%3 == 0){
         phone.map((arr,i)=>{
             arr.map((x,j)=>{
                 if(val == x)[rRight,cRight,num] = returnRight(i,j)   
             })
         })
         return num;
     }
 })
 return result.join('')
}

반복되는 부분을 returnLeft와 returnRight 함수로 만들었다.

profile
나의 하루를 가능한 기억하고 즐기고 후회하지말자

0개의 댓글