말랑한 하루

[Programmers] 수식 최대화 (Lv 2, JavaScript) 본문

문제풀이/Programmers

[Programmers] 수식 최대화 (Lv 2, JavaScript)

지수는말랑이 2022. 7. 18. 19:09
반응형

[ 개요 ] 
풀이시간 : 70분

[ 학습 내용 ]
JS에서 조합, 순열 구현을 기반으로 풀이를 진행

[ 소스 코드 ]

function splitExpression(ex) {
    var exs = [];
    var oper = new Set();
    var idx = 0;
    for(var i=0; i<ex.length; i++) {
        if ("0".charCodeAt(0) > ex.charCodeAt(i) 
            || ex.charCodeAt(i) > "9".charCodeAt(0)) {
            exs.push(parseInt(ex.slice(idx, i)));
            exs.push(ex[i]);
            oper.add(ex[i]);
            idx = i + 1;
        }
    }
    exs.push(parseInt(ex.slice(idx)));
    return [exs, Array.from(oper)];
}

function getPermutations(arr, selectNumber) {
    const results = [];
    if (selectNumber === 1) return arr.map((el) => [el]);

    arr.forEach((fixed, index, origin) => {
      const rest = [...origin.slice(0, index), ...origin.slice(index+1)];
      const permutations = getPermutations(rest, selectNumber - 1);
      const attached = permutations.map((el) => [fixed, ...el]);
      results.push(...attached);
    });

    return results;
}

function calc(oper, fs, se) {
    switch(oper) {
        case "+":
            return fs + se;
        case "-":
            return fs - se;
        case "*":
            return fs * se;
    }
}

function solution(expression) {
    var answer = 0;
    
    var [expressions, operators] = splitExpression(expression);
    var operator_permutations = getPermutations(operators, operators.length);
    
    operator_permutations.forEach((opers, index) => {
        let express = expressions;
        opers.forEach((oper) => {
            let index = 1;
            for(var i=1; i<express.length;) {
                if (oper === express[i]) {
                    let result = calc(express[i], express[i-1], express[i+1]);
                    express = [...express.slice(0, i-1), result, ...express.slice(i + 2)];
                } else {
                    i+= 2;
                }
            }
        });
        answer = Math.max(answer, Math.abs(express[0]));
    })
    
    return answer;
}

[ 코드 분석 ]

문자열 수식을 숫자+연산자로 구분하여 배열에 심은 뒤,

연산자를 기준으로 우선순위에 따라 계산할지, 넘길지 판단하여 모든 연산자를 계산한다.

1) splitExpression : 문자열 수식을 숫자+연산자로 분리

2) getPermutations : 연산자의 우선순위 부여 순열

3) calc : 연산자 계산

반응형
Comments