알고리즘 - 수식 최대화

HoJeong Im·2021년 9월 17일
0

Break_Algo

목록 보기
3/46

문제

  • 순열, 구현 문제

  • 너무 오래 걸리게 푼듯?

코드

function perm(arr, selectNum){
    let result = [];
    
    if(selectNum === 1){
        return arr.map((v)=>[v]);
    }
    
    arr.forEach((item, index, arr)=>{
         const fixer = item;
         const restArr = arr.filter((_, restIdx) => restIdx !== index);
        const permutationArr = perm(restArr, selectNum-1);
        const combineFixer = permutationArr.map((v)=>[fixer, ...v]);
        result.push(...combineFixer);
    });
    
    
    return result;
    
}


function solution(expression) {
    var answer = 0;
    
    let oper = expression.split(/[0-9]+/g).filter((e)=>e!='');
    
    let sets = new Set(oper);
    
    let array = Array.from(sets);
    
    let arr = perm(array, array.length);
    
    //console.log(arr);
    
    let max = -1;
    let test = expression;
    
    let express = expression.split(/([-+*])/g).filter((e)=>e!='');
    
    //console.log(express)
    arr.forEach((item, idx2)=>{
        let express2 = express.slice();
        //console.log(idx2+1)
        item.forEach((v,idxtest)=>{
            
            //let s1 = express2.indexOf(v);
            //console.log('express2',express2)
            let s2 = express2.map((v1,idx)=> {
                if(v1 === v){
                    return idx;
                }
            }).filter((v3)=>v3!=undefined);
            
            
            if(s2.length >= 2){
                s2 = s2.map((v,idx3)=>{
                    if(idx3>=1){
                        return v-2*idx3;
                    }
                    else {
                        return v;
                    }
                })
            }
            //console.log(s2)
            s2.forEach((s1)=>{
                if(v==='-'){
                    express2[s1+1] = parseInt(express2[s1-1]) - parseInt(express2[s1+1]);  
                }
                else if(v==='*'){
                    express2[s1+1] = parseInt(express2[s1-1]) * parseInt(express2[s1+1]);
                }
                else if(v==='+'){
                    express2[s1+1] = parseInt(express2[s1-1]) + parseInt(express2[s1+1]);
                }
                express2.splice(s1-1,1);
                express2.splice(s1-1,1);
               // console.log(express2)
            });
           
            
        });
        max = Math.max(Math.abs(express2[0]), max);
        test = expression;
    });
    console.log(max)
    
    return max;
}

회고

  • split하고 빈 값이 배열에 들어가는 경우를 일단은 filter 처리함

  • Separator를 포함할 수 있는 정규 표현식의 방법

    • capturing parentheses를 사용하는 방법!
    • 링크
    	expressions.split(/([-+*])/g)
  • 순열, 조합의 방식을 JS 방식으로 익혀서 다시 준비하자!

  • set에서 array로 변환하는 JS의 코드 방식!

  • array를 매개변수로 set을 생성 가능

profile
꾸준함이 제일 빠른 길이었다

0개의 댓글