study
수식 최대화[프로그래머스]
Date: 2026-05-28 13:59
Update: 2026-05-29 07:16
수식 최대화[프로그래머스]
접근법:
- 주어진 문자열을 연산자와 숫자로 분리한다.
- 3가지 연산자의 순열에 대해 모든 연산을 시뮬레이션한다.
- 이때, 원본에 영향을 가지 않도록 숫자 배열과 연산자 배열을 복사해서 사용한다.
- 현재 우선순위와 현재의 연산자가 같다면
- i번째 숫자와 i+ 1 번째 숫자를 연산한다.
- 이 결과를 다시 i 번째 숫자에 저장하고
- i+1 번째 숫자와 i 번째 연산자를 배열에서 삭제한다.
- i를 감소시켜 다은 요소를 건너 뛰지않도록한다.
- 모든 연산이 끝난 최종값 배열의 0번과 answer를 비교해 최댓값을 구한다
- 최댓값을 리턴한다.
#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;
}
.gif)