study
수식 최대화[프로그래머스]
Date: 2026-05-28 13:59
Update: 2026-05-29 07:16


수식 최대화[프로그래머스]

접근법:

  1. 주어진 문자열을 연산자와 숫자로 분리한다.
  2. 3가지 연산자의 순열에 대해 모든 연산을 시뮬레이션한다.
    1. 이때, 원본에 영향을 가지 않도록 숫자 배열과 연산자 배열을 복사해서 사용한다.
    2. 현재 우선순위와 현재의 연산자가 같다면
    3. i번째 숫자와 i+ 1 번째 숫자를 연산한다.
    4. 이 결과를 다시 i 번째 숫자에 저장하고
    5. i+1 번째 숫자와 i 번째 연산자를 배열에서 삭제한다.
    6. i를 감소시켜 다은 요소를 건너 뛰지않도록한다.
    7. 모든 연산이 끝난 최종값 배열의 0번과 answer를 비교해 최댓값을 구한다
  3. 최댓값을 리턴한다.
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
long long calculate(const long long& a, const long long& b, const char& op)
{
    if(op == '+') return a + b;
    if(op == '-') return a - b;
    if(op == '*') return a * b;
    return 0;
}

long long solution(string expression) {
    long long answer = 0;
    vector<long long> numbers;
    vector<char> ops;
    vector<char> priority = {'*', '+', '-'};
    sort(priority.begin(), priority.end());
    string temp = "";
    for(int i = 0; i < expression.size(); ++i)
    {
        if(isdigit(expression[i]))
        {
            temp += expression[i];
        }else
        {
            numbers.push_back(stoll(temp));
            temp.clear();
            ops.push_back(expression[i]);
        }
    }
    numbers.push_back(stoll(temp));
    
    do
    {
        vector<long long> temp_numbers = numbers;
        vector<char> temp_ops = ops;
        
        for(char current_op : priority)
        {
            for(int i = 0 ; i < temp_ops.size(); ++i)
            {
                if(temp_ops[i] == current_op)
                {
                    long long res = calculate(temp_numbers[i], temp_numbers[i + 1], temp_ops[i]);
                    temp_numbers[i] = res;
                    
                    temp_numbers.erase(temp_numbers.begin() + i + 1);
                    temp_ops.erase(temp_ops.begin() + i);
                    i--;
                }
            }
        }
        
        answer = max(answer, abs(temp_numbers[0]));
        
    } while(next_permutation(priority.begin(), priority.end()));
    
    return answer;
}