#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
long long calculate(long long a, long long b, char opr); //계산
long long solve(string oper, vector<char> &operators, vector<long long> &nums); //우선순위
long long solution(string expression) {
long long answer = 0;
vector<long long> nums; //수들을 저장
vector<char> operators; //연산자를 저장
string num = ""; //수를 일시적으로 저장할 공간
for (int i = 0; i < expression.length(); i++)
{
if (expression[i] == '*' || expression[i] == '+' || expression[i] == '-')
{
nums.push_back(stoi(num)); //수를 저장한 것을 int형으로 바꿔서 저장
num = "";
operators.push_back(expression[i]); //연산자를 저장
}
else
num += expression[i]; //한글자씩 추가
}
nums.push_back(stoi(num)); //마지막 수
//우선순위별 최대값을 구한다. 연산자가 2개나 1개여도 for문 내에서 없으면 무시하고 지나가게함
answer = max(answer, abs(solve("*+-", operators, nums)));
answer = max(answer, abs(solve("*-+", operators, nums)));
answer = max(answer, abs(solve("+-*", operators, nums)));
answer = max(answer, abs(solve("+*-", operators, nums)));
answer = max(answer, abs(solve("-*+", operators, nums)));
answer = max(answer, abs(solve("-+*", operators, nums)));
return answer;
}
long long solve(string oper, vector<char> &operators, vector<long long> &nums)
{
vector<long long> tempNums = nums;
vector<char> tempOperators = operators;
for(int i = 0; i < 3; i++) //우선순위별 3가지 반복
{
for(int j = 0; j < tempOperators.size(); j++) //연산자의 개수만큼 반복
{
if(oper[i] == tempOperators[j]) //우선 연산자와 현재 연산자가 같나
{
//같으면 계산 후에 원래vector에 넣어준다.
tempNums[j] = calculate(tempNums[j], tempNums[j + 1], oper[i]);
tempNums.erase(tempNums.begin() + j + 1); //계산하고 남은 뒷값은 제거
tempOperators.erase(tempOperators.begin() + j); //계산한 연산자 제거
j--; //한개 줄었으므로 감소 (현재 계산된 값과 그 다음값이 연산가능한지 확인됨)
}
}
}
return tempNums[0]; //마지막 남은 한개의 값이 최종 결과
}
long long calculate(long long a, long long b, char opr) //해당 연산자인지 확인후 그것에 맞는 계산
{
if (opr == '+')
return a + b;
else if (opr == '-')
return a - b;
else if (opr == '*')
return a * b;
}
풀이
- 처음에는 연산자와 수들을 분리해준다.
- 최대 가능한 가지수인 6개의 연산자만큼 각각 확인해준다.
- 해당 연산자를 찾으면 해당 연산자번째와 그 다음번째의 값을 해당 연산을 해준다.
- 연산한 값을 계산한 앞값인 vector에 대입해주고 계산했던 뒤의 값은 제거해주어 다음 값과 이어지게 해준다.
- 반복하면 최종 한개의 값을 가지게되는데 이 값을 abs로 양수를 만들어준다.
- 이 최종값과 제일 높은 값을 반환할 변수와 비교하면서 가장 큰 숫자를 제출한다.
6번만 반복하면 어차피 연산자가 2개던 1개던 상관없다. 해당 연산자와 같지 않으면 연산자체를 안 하게 설정.
'Algorithm > Programmers' 카테고리의 다른 글
[C++] 프로그래머스 오픈채팅방 2019카카오블라인드 (0) | 2021.05.10 |
---|---|
[C++] 프로그래머스 가장먼노드 BFS (0) | 2021.05.09 |
[C++] 프로그래머스 여행경로 DFS/BFS (0) | 2021.05.06 |
[C++] 프로그래머스 키패드누르기 2020 카카오 인턴십 (0) | 2021.05.05 |
[C++] 프로그래머스 더 맵게 힙 (0) | 2021.05.04 |