오늘의 알고리즘

[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;
}
 

수식이랑 숫자를 나눠서 계산하면 제일 편하다.

삭제할 때 조금 잘 못 해서 고난 좀 겪었는데 어떻게든 끝냈네..