C++:: 프로그래머스 < 수식 최대화 >

jahlee·2023년 7월 3일
0

프로그래머스_Lv.2

목록 보기
63/106
post-thumbnail

주어진 인자들을 n!로 순열하는 방식에 대한 함수를 공부할 수 있었던 문제이다. next_permutation이라는 함수를 사용하였고 이함수는 보통 do while문과 같이 사용한다. next_permutation을 사용할 때 주의해야 하는점은 정렬된 벡터에 대해 사용해주어야 온전한 순열 조합들을 다 구할 수 있다는 점이다.

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

long long cal(long long a, long long b, char c) {
    if (c == '-') return a - b;
    else if (c == '+') return a + b;
    return a * b;
}

long long solution(string expression) {
    long long answer = 0;
    vector<long long> nums;// expression에서 숫자만 뽑아낸 벡터
    vector<char> operators;// expression에서 연산자만 뽑아낸 벡터
    vector<char> oper = {'+','-','*'};
    sort(oper.begin(), oper.end());// 온전한 3! 가지수의 순열 조합을 뽑기위해서 정렬해준다.
    string tmp = "";
    for (int i=0; i<expression.size(); i++) {
        if (isdigit(expression[i])) {
            tmp += expression[i];
        } else {
            nums.push_back(stoll(tmp));
            operators.push_back(expression[i]);
            tmp = "";
        }
    }
    nums.push_back(stoll(tmp));
    
    do {
        vector<long long> numsTmp(nums);
        vector<char> operTmp(operators);
        for (int i=0; i<3; i++) {
            for (int j=0; j<operTmp.size(); ) {
                if (oper[i] == operTmp[j]) {// 순열에서의 연산자이면
                    long long res = cal(numsTmp[j], numsTmp[j+1], operTmp[j]);// 결과 숫자 계산
                    numsTmp.erase(numsTmp.begin() + j, numsTmp.begin() + j + 2);// 숫자 두개 삭제
                    operTmp.erase(operTmp.begin() + j);// 연산자 삭제
                    numsTmp.insert(numsTmp.begin() + j, res);// 결과 숫자 추가
                } else {
                    j++;
                }
            }
        }
        answer = max(answer, abs(numsTmp[0]));
    } while (next_permutation(oper.begin(), oper.end()));
    
    return answer;
}

0개의 댓글