eaz_coding

[Programmers] 수식 최대화(Javascript) 본문

eaz_algorithm

[Programmers] 수식 최대화(Javascript)

eaz_silver 2024. 6. 6. 18:51

문제

문제

https://school.programmers.co.kr/learn/courses/30/lessons/67257

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


풀이

복잡하게 중위 후위 바꾸기보다 반복문으로 간단하게 할 수 있다.

문제에서 바로 생각나는 대로 풀기보다 더 단순한 풀이를 생각해보자!

주의해야 할 점

1. 리스트 복사 시 [...list]

2. permutation, combination 아직 덜 외워짐 더 외울것

3. 배열 초기화 확인하기

4. Math 주요 기능, Math.abs, Math.floor, Math.ceil, Math.sum 등등

5. .includes는 리스트, .contains는 문자열

function permutation(arr, num){
    const res = [];
    if(num === 1) return arr.map((v) => [v]);
    let cnt = 0;
    
    arr.forEach((v, idx, arr) => {
        cnt += 1;
        const rest = [...arr.slice(0,idx), ...arr.slice(idx+1)];
        const permutations = permutation(rest, num-1);
        const attach = permutations.map((p) => [v, ...p]);
        res.push(...attach);
    })
    return res;
}

function cal(a, b, f) {
    if (f === "+") {
        return a+b;
    } else if(f === "-") {
        return a-b;
    } else {
        return a*b;
    }
}

function change(ex) {
    let new_ex = [];
    let tmp = '';
    for (let j = 0; j < ex.length; j++){
        if (["+", "-", "*"].includes(ex[j])) {
            new_ex.push(Number(tmp));
            new_ex.push(ex[j]);
            tmp = '';
        } else {
            tmp += ex[j];
        }
    }
    new_ex.push(Number(tmp))
    return new_ex;
}

function solution(expression) {
    var answer = 0;
    
    let ex = change(expression);
    let lst = permutation(["+", "-", "*"], 3);
    
    lst.forEach((el) => {
        let stack = [];
        let tmp = [...ex];
        
        for (const f of el){
            while (tmp.length) {
                let t = tmp.shift();
                if (f===t){
                    stack.push(cal(stack.pop(), tmp.shift(), t));
                } else {
                    stack.push(t);
                }
            }
            tmp = [...stack];
            stack = [];
        }
        
        if (answer < Math.abs(tmp[0])) {
            answer = Math.abs(tmp[0]);
        }
    })
    return answer;
}