Level 2️⃣ - 수식 최대화

2024. 4. 24. 19:46알고리즘/프로그래머스

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

 

프로그래머스

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

programmers.co.kr

🚀문제 접근

우선순위의 경우의 수는 부호가 총 3가지이므로 6가지이다.

만약 우선 순위가 - > + > * 라면 - 연산부터 모두 하고, 그 다음에 + 연산, 그 다음에 * 연산을 이어서 해주면 된다.

그림으로 표현하면 다음과 같다.

 

그렇다면 입력값으로 주어지는 "100-200*300-500+20" 이라는 문자열을 부호기호와 숫자를 분리해야한다.

[100, -, 200, *, 300, -, 500, +, 20] 

그리고 우선순위에 맞게 먼저 계산을 해주면 된다. 어떻게 구현할 수 있을까?

- 부터 계산을 해야한다면 - 를 기준으로 양 옆의 숫자를 - 와 함께 제거한 후, - 계산을 완료한 값을 다시 넣어주면 된다.

코드를 보면 이해가 쉬울 것이다.

🛠코드

function solution(expression) {
    let ret = [];
    const priorities = [
        ['-', '+', '*'],
        ['-', '*', '+'],
        ['+', '-', '*'],
        ['+', '*', '-'],
        ['*', '+', '-'],
        ['*', '-', '+'],   
    ];
    
    for(const priority of priorities){
        const temp = format(expression);
        for(const elem of priority){
            while(temp.includes(elem)){
                const idx = temp.indexOf(elem);
                temp.splice(idx-1, 3, eval(temp.slice(idx-1, idx+2).join("")));
            }
        }
        ret.push(Math.abs(temp[0]));
    }
    
    return Math.max(...ret);
}

function format(str){
    let ret = [];
    let temp = "";
    for(let i = 0; i<str.length; i++){
        if(!Number.isNaN(Number(str[i]))) temp += str[i];
        else {
            ret.push(temp);
            ret.push(str[i]);
            temp = "";
        }
    }
    ret.push(temp);
    
    return ret;
}