주어진 문자열에서 각각의 숫자와 연산자를 토큰화해 벡터에 저장한다.
만들어진 벡터를 이용해 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 |