프로그래머스/Level_2

[Level_2 / C++ / 카카오] 수식 최대화

배발자 2022. 1. 20.
반응형
 

<erase/insert> 삭제 및 삽입

벡터의 원소를 삭제를 하면 이후 인덱스에 해당하는 값이 지운 인덱스 칸을 채울 수 있다. 또한 어떤 특정 인덱스에 특정값을 삽입 하면 기존에 있던 값들은 뒤에 위치하게 된다. 다음 문법을 확

baebalja.tistory.com

 

<next_permutation> 모든 경우의 수 정렬

벡터를 정렬할 때 정렬 될 수 있는 모든 경우의 수를 물어보는 문제가 있다. 이러한 경우 해당 함수를 사용한다. 즉, A B C 를 정렬하고 싶은데 모든 경우를 정렬하면, ABC ACB BAC BCA CAB CBA 순으로 정

baebalja.tistory.com


우선 연산자의 우선순위가 주어지는데 총 세가지 연산자가 있다. 

"*", "-", "+"

이 연산자를 p_cal 이라는 벡터에 넣고 정렬해준다. 

next_permutaion 함수를 적용하기 위해서는 아스키코드가 작은값부터 정렬이 되어야 모든 경우의 수를 정렬할 수 있기 때문이다. 

 

정렬 됐으면 첫번째 우선순위의 연산자를 계속 수행하는것이다. 

 

즉, 첫번째 우선순위 연산자는 (*) -> (+) -> (-) 이런순으로 되어있는데, 먼저 * 연산자에 해당되는 인덱스 

전 후의 값들을 * 연산을 다 해준다. 이후 +와 - 연산자 또한 다음과 같이 수행한다. 

그리고 그 값의 절댓값이 가장 큰 값을 저장시켜준다. 

 

두번째 우선순위 연산자는 next_permutation 함수를 통해 

 (*) -> (-)  -> (+) 가 나온다. 이 순서대로 연산을 해준다. 

 

연산자는 총 3개이니 3X2X1 = 6 가지의 우선순위로 정렬된 연산자들을 통해 값을 도출한다. 

 

#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <iostream>
using namespace std;
typedef long long ll;
ll cal_act(ll a, ll b, char c) {
    if (c == '-')return a - b;
    else if (c == '*')return a * b;
    else return a + b;
}
long long solution(string expression) {
    string s = expression;
    long long answer = 0;
    vector <char> p_cal = { '*','+','-' };
    vector <ll> num;
    vector <char> cal;
    sort(p_cal.begin(), p_cal.end());
    string temp = "";
    for (int i = 0; i < s.size(); i++) {
        if (s[i] >= '0' && s[i] <= '9')temp += s[i];
        else {
            num.push_back(stoll(temp));
            cal.push_back(s[i]);
            temp = "";
        }
    }
    num.push_back(stoll(temp));
    ll max_num = -1;
    do {
        vector <ll>n = num;
        vector <char> c = cal;       
        for (int i = 0; i <= 2; i++) {
            for (int j = 0; j < c.size(); ) {
                if (p_cal[i] == c[j]) {              
                    ll result = cal_act(n[j], n[j + 1], c[j]);
                    n.erase(n.begin() + j, n.begin()+j+2);           
                    c.erase(c.begin() + j);
                    n.insert(n.begin() + j, result);            
                }
                else j++;                 
            }            
        }
        max_num = max(max_num, abs(n[0]));
    } while (next_permutation(p_cal.begin(), p_cal.end()));
    return max_num;
}
 

코딩테스트 연습 - 수식 최대화

IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다. 이번 대회에서는 우승자에게 지급되는 상금을 이전 대회와는 다르게 다음과

programmers.co.kr

반응형

댓글