본문 바로가기

problem solving

[프로그래머스]수식 최대화

주어진 문자열에서 각각의 숫자와 연산자를 토큰화해 벡터에 저장한다.

만들어진 벡터를 이용해 3!의 경우의 수만큼 반복문을 순회하는데, 

현재 반복에서 operation에 정의된 문자가 {"*", "-", "+"}라면 벡터에서 * 연산자만 찾아서 전후의 값을 연산한다.

만약 전과 후의 값이 300과 500이라면 15000이라는 값이 결과로 나온다.

그리고나서 연산에 사용된 3개의 값("*", 300, 500)을 erase하고, 결과 값을 해당 위치에 insert한다.

마지막으로 새로나론 결과부터 연산을 진행할 수 있도록 반복문의 값을 1만큼 줄여준다.

현재 반복문에서 operation 순서가 {"*", "-", "+"}라면 벡터에서 *연산을 전부 진행한 후 -연산을 전부 진행하고 +연산을 진행하면 마지막에 벡터에 값이 1개가 남게 되는데 이 값이 최종 연산 결과다.

이 결과가 기존의 answer값보다 크다면 answer값을 현재 결과로 교체한다.

(어렵지 않은 문제인데, 문자열을 숫자로 변환하는 과정에서 잘못해 삽질을 했다. 주어진 배열에서 숫자의 범위가 int형을 넘어갈 수 있으므로, long long을 사용해야함에 주의)

 
#include <string>
#include <vector>
#include <cstdlib>
 
using namespace std;
 
vector<string> tokenization(string str) {
    vector<string> return_arr;
    string temp = "", ope = "";
    for (int i = 0; i < str.length(); i++) {
        if (str[i] == '-' || str[i] == '+' || str[i] == '*') {
            return_arr.push_back(temp);
            ope = "", ope = ope + str[i];
            return_arr.push_back(ope);
            temp = "";
            i++;
        }
        temp = temp + str[i];
    }
    return_arr.push_back(temp);
    return return_arr;
}
 
long long my_operation(string operation, string a, string b) {
    long long sum = 0;
    if (operation == "-") {
        sum = stoll(a) - stoll(b);
    }
    else if (operation == "+") {
        sum = stoll(a) + stoll(b);
    }
    else if (operation == "*") {
        sum = stoll(a) * stoll(b);
    }
    return sum;
}
 
long long solution(string expression) {
    long long answer = 0;
 
    string operation[6][3= { {"-""+""*"},
                              {"-""*""+"},
                              {"+""-""*"},
                              {"+""*""-"},
                              {"*""+""-"},
                              {"*""-""+"}, };
    long long sum = 0;
    vector<string> store = tokenization(expression);
    for (int i = 0; i < 6; i++) {
        store.clear();
        store = tokenization(expression);
        for (int u = 0; u < 3; u++) {
            for (int j = 0; j < store.size() - 1; j++) {
                if (store[j + 1!= operation[i][u]) { continue; }
                sum = my_operation(operation[i][u], store[j], store[j + 2]);
                for (int k = 0; k < 3; k++) { store.erase(store.begin() + j); }
                store.insert(store.begin() + j, to_string(sum));
                j--;
            }
        }
        sum = abs(stoll(store[0]));
        answer = answer > sum ? answer : sum;
    }
    return answer;
}
cs

'problem solving' 카테고리의 다른 글

[프로그래머스]기둥과 보 설치  (0) 2020.08.31
[프로그래머스]자물쇠와 열쇠  (0) 2020.08.30
[프로그래머스]후보키  (0) 2020.08.26
[BOJ]13460번: 구슬 탈출2  (0) 2020.07.19
[BOJ]15683번: 감시  (0) 2020.07.18