Coding_Test/2020_KAKAO_INTERN

[2020 카카오 인턴] 수식 최대화 (C++)

Codetesing 2022. 5. 10. 16:37

2020 카카오 인턴 코테 문제

5시간을 잡고 실전처럼 진행하였으며 코드의 최적화나 알고리즘은 정확하지 않음.


코딩테스트 연습 - 수식 최대화 | 프로그래머스 (programmers.co.kr)

 

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

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

programmers.co.kr


2번 문제였으며 약 1시간 정도 소요되었다.

dfs를 써서 각 우선순위의 연산자 순서대로 배열에 넣으며 계산한다.

어렵지는 않았으나 바로 생각이 안났었다.

#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <cmath>

using namespace std;

vector<long long> num;
vector<char> operand_pred;
map<int, char> temp;
bool visited[3] = { false };
string operand_list = "";
int cnt = 0;
long long ans = 0;

long long calculate(long long a, long long b, char op)
{
    if (op == '+') return a + b;
    if (op == '-') return a - b;
    if (op == '*') return a * b;
}

long long calculate_all()
{
    vector<long long> cal = num;
    string op_list = operand_list;

    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < op_list.size(); j++)
        {
            if (op_list[j] == operand_pred[i])
            {
                long long res = calculate(cal[j], cal[j + 1], op_list[j]);
                cal.erase(cal.begin() + j);
                cal[j] = res;
                op_list.erase(op_list.begin() + j);
                j--;
            }
        }
    }

    return abs(cal[0]);
}

void DFS(int ind)
{
    if (ind == 3)
    {
        long long res = calculate_all();
        ans = max(res, ans);
        return;
    }

    for (int i = 0; i < 3; i++)
    {
        if (!visited[i])
        {
            visited[i] = true;
            operand_pred.push_back(temp[i]);
            DFS(ind + 1);
            operand_pred.pop_back();
            visited[i] = false;
        }
    }
}

long long solution(string expression) {
    long long answer = 0;
    temp[0] = '+';
    temp[1] = '-';
    temp[2] = '*';

    string n = "";
    for (int i = 0; i < expression.size(); i++)
    {
        if (!isdigit(expression[i]))
        {
            num.push_back(stoll(n));
            n = "";
            operand_list += expression[i];
        }
        else
            n += expression[i];
    }
    num.push_back(stoll(n));

    DFS(0);

    answer = ans;
    return answer;
}