오늘의 알고리즘
[C++]2020 카카오 인턴십 수식 최대화(프로그래머스 2레벨)
하늘하늘 .
2022. 2. 18. 19:05
#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
long long Cal(long long LFirst, long long LSecond, char cArt)
{
switch (cArt)
{
case '+':
return LFirst + LSecond;
case '*':
return LFirst * LSecond;
case '-' :
return LFirst - LSecond;
}
return 0;
}
long long solution(string expression)
{
long long answer = 0;
// 가진 수식 갯수
string stringExOperator = {};
// 가진 수식 종류
string stringOperator = "*+-";
// 인트를 string으로 나눴다.
vector<string> vecStringInt = {};
unordered_map<char, int> mapOperator = {};
int iSize = expression.size();
int iNumber = 0;
for (int i = 0; i < iSize; ++i)
{
if (expression[i] < '0')
{
// 수식이랑 인트랑 나눠서 넣는다
stringExOperator.push_back(expression[i]);
vecStringInt.push_back(string(expression, iNumber, i - iNumber));
iNumber = i + 1;
}
// 마지막은 그냥 인트 그대로 입력
if (i == iSize - 1)
vecStringInt.push_back(string(expression, iNumber, iSize - iNumber));
}
bool bTrue = true;
do
{
string strOperator = stringExOperator;
vector<string> vecSubStringInt = vecStringInt;
for (int i = 0; i < stringOperator.size(); ++i)
{
for (int j = 0; j < strOperator.size(); ++j)
{
if (stringOperator[i] == strOperator[j])
{
// 수식의 앞과 뒤 순서의 값를 가져와서 계산
long long LFirst = stoll(vecSubStringInt[j]);
long long LSecond = stoll(vecSubStringInt[j+1]);
vecSubStringInt[j] = to_string(Cal(LFirst, LSecond, strOperator[j]));
// 사용한 값과 수식 삭제
vecSubStringInt.erase(vecSubStringInt.begin() + j + 1);
strOperator.erase(strOperator.begin() + j);
--j;
}
}
}
long long LAnswer = stoll(vecSubStringInt[0]);
// 크기 계산
if (answer < abs(LAnswer))
answer = abs(LAnswer);
} while (next_permutation(stringOperator.begin(), stringOperator.end()));
return answer;
}
수식이랑 숫자를 나눠서 계산하면 제일 편하다.
삭제할 때 조금 잘 못 해서 고난 좀 겪었는데 어떻게든 끝냈네..