-
프로그래머스 수식 최대화 c++알고리즘/프로그래머스 2022. 12. 21. 23:06반응형
**
프로그램 흐름도
1. 숫자, 문자를 구분해 vector<string> rem 에 넣어준다.
2. +,-,* 에 0,1,2 로 번호를 붙인 뒤 0,1,2 로 이루어진 순열 생성
3. 순열 번호와 동일한 번호를 가진 연산자를 먼저 계산
4. 최대값 갱신
#include <string> #include <vector> #include <stack> #include <algorithm> #include <cmath> #include <iostream> using namespace std; string c[3] = {"-","*","+"}; vector<int> v; vector<string> rem; stack<string> stk; void insertStr(string str) { string tmp = ""; for(int i=0; i<str.length(); i++) { if(!isdigit(str[i])) { rem.push_back(tmp); if(str[i] == '-') { rem.push_back("-"); } else if(str[i] == '*') { rem.push_back("*"); } else if(str[i] == '+') { rem.push_back("+"); } tmp = ""; } else { tmp = tmp + str[i]; } } rem.push_back(tmp); } long long calculateOperator(long long tmp1, long long tmp2, string op) { if(op == "-") { return tmp1 - tmp2; } else if(op == "*") { return tmp1 * tmp2; } else if(op == "+") { return tmp1 + tmp2; } } vector<string> calculate(string op) { vector<string> r; bool check[101] = {false,}; for(int i=0; i<rem.size(); i++) { if(rem[i] == op) { long long tmp1 = stoll(stk.top()); long long tmp2 = stoll(rem[i+1]); stk.push(to_string(calculateOperator(tmp1,tmp2,op))); r.pop_back(); stk.pop(); i++; r.push_back(stk.top()); } else { stk.push(rem[i]); r.push_back(rem[i]); } } return r; } long long solution(string expression) { long long answer = 0; for(int i=0; i<3; i++) { v.push_back(i); } do { long long result = 0; insertStr(expression); for(int i=0; i<3; i++) { rem = calculate(c[v[i]]); } result = stoll(stk.top()); stk.pop(); if(abs(answer) < abs(result)) { answer = abs(result); } rem.clear(); } while(next_permutation(v.begin(),v.end())); return answer; }
728x90반응형'알고리즘 > 프로그래머스' 카테고리의 다른 글
[C++] 프로그래머스 베스트앨범 (0) 2022.12.26 프로그래머스 부대복귀 c++ (0) 2022.12.23 프로그래머스 피로도 c++ (0) 2022.12.21 프로그래머스 괄호 회전하기 c++ (0) 2022.12.04 프로그래머스 2개 이하로 다른 비트 c++ (0) 2022.11.30