プログラマー:キーボードを押す(2020ココア実習)


質問する
100/100
1時間10分

基本内容


キーボードの左側の線は左手、右側の線は右手です.
中間で対応する距離を計算し、近い方向に行い、両者が同じであれば手作業で並べて適用します.

コード#コード#

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)差が正の場合
    2)差が負数の場合
    3)差が0の場合=>hand[0]が「r」の場合とhand[0]が「l」の場合の
  • 左時
  • 右時
  •  phone.map((arr,i)=>{
                    arr.map((x,j)=>{
                        if(val == x){
                           ...
                        }    
                    })
                })
    上記の構成は、対応するi,jの値valがxに等しい場合に適用されることが多い.

    コードの簡略化

    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関数に変えた.