[Programmers] 수식 최대화(Lv.2)

Alice·2023년 8월 5일
0

풀이 소요시간 : 우웩


어차피 연산자는 최대 3개 뿐이다.

따라서 굳이 set 같은 자료구조로 종류를 파악하지 말고 전역변수에 다 넣어두자.


수식 문제에서는 숫자와 문자를 분리해서 저장하자

괜히 한번에 저장하고 관리했다가 끔찍한 core dump 를 맛보았다.


마지막 숫자, 마지막 인덱스 등 디테일 신경좀 쓰자

요즘 정신놓고 신경 안쓰다가 말아먹는 경우가 종종 많아진듯 하다. 정신좀 차리자.


STL 기본함수 좀 제대로 외워두자

정리를 안해두니까 헷갈리는 경우가 빈번하다.


전체 코드

include <string>
#include <vector>
#include <cmath>
#include <sstream>
using namespace std;

char Oper[3] = {'-', '+', '*'};
vector<char> OP;
int Visit[3];

string Exp;
long long Ans = 0;



void Update_Max() {
    
    vector<long long> Num_Temp;
    vector<char> Oper_Temp;
    string token = "";
    for(int i = 0; i < Exp.length(); i++)
    {
        if(Exp[i] >= '0' && Exp[i] <= '9') 
        {
            token += Exp[i];
        }
        else
        {
            Num_Temp.push_back((long long)stoi(token));
            Oper_Temp.push_back(Exp[i]);
            token = ""; 
        }
    }
    Num_Temp.push_back((long long)stoi(token)); 
    //Temp 초기화
    
    
    for(int op = 0; op < 3; op++)
    {
        char Curr_OP = OP[op];   

        for(int i = 0; i < Oper_Temp.size(); i++)
        {
            if(Oper_Temp[i] == Curr_OP)
            {
                long long prev = Num_Temp[i];
                long long next = Num_Temp[i + 1];
                
                long long Fin;
                if(Curr_OP == '+') Fin = prev + next;
                else if(Curr_OP == '-') Fin = prev - next;
                else if(Curr_OP == '*') Fin = prev * next;                
                
                Num_Temp[i] = Fin;
                Num_Temp.erase(Num_Temp.begin() + (i + 1));

                Oper_Temp.erase(Oper_Temp.begin() + i);
                i--;
            }
        }
    }

    Ans = max(Ans, abs(Num_Temp[0]));
}


//연산자 모든 경우의 수 조합
void Make_Priority(int Count) {
    if(Count == 3)
    {
        Update_Max();
        return;
    }
    for(int i = 0; i < 3; i++)
    {
        if(Visit[i] == 1) continue;
        
        Visit[i] = 1;
        OP.push_back(Oper[i]);
        
        Make_Priority(Count + 1);
        
        Visit[i] = 0;
        OP.pop_back();
    }
}


long long solution(string expression) {
    Exp = expression;
    Make_Priority(0);
    return Ans;
}
profile
SSAFY 11th

0개의 댓글