수학식을 어떻게 깔끔하게 처리하지....
중복순열로 모든 경우를 확인했다. 결과마다 식을 미리 저장해두고 식만 미리 뽑아쓰게 계산했다.
4 - 4- 4 - 4 = ??
arr[??] = "4 - 4- 4 - 4 = ??" 요런 식으로
그런데 이제 식을 계산하는게 문제였다. 4 * 4 + 4 * 4를 *부터 계산해야 하는데 이걸 어떻게 처리할지 아주 고민이었다.
결국 *를 먼저 계산해두고 나중에 +-를 계산하도록 했다. 그런데 마음에 들지 않는다.... 다른 사람 코드를 좀 봐야겠다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <map>
#include <cmath>
#include <cstring>
#include <bitset>
#include <stdio.h>
#include <math.h>
#include <sstream>
#define xx first
#define yy second
#define all(x) (x).begin(), (x).end()
using namespace std;
using i64 = long long int;
using ii = pair<int, int>;
using iis = pair<int, string>;
using ii64 = pair<i64, i64>;
using iii = tuple<int, int, int>;
#define SUM 1000000
string ans[3000000];
void solve(vector<char> perm) {
string s = "";
for(int i = 0; i < perm.size(); i++)
{
s += "4 ";
s += perm[i];
s += " ";
}
s += "4 = ";
// 곱셈 계산용
stack<string> st;
st.push("4");
for(int i = 0; i < perm.size(); i++)
{
if (perm[i] == '*') {
string tmp = st.top();
st.pop();
st.push(to_string(stoi(tmp) * 4));
continue;
}
else if (perm[i] == '+')
st.push("+");
else if (perm[i] == '-')
st.push("-");
else if (perm[i] == '/') {
string tmp = st.top();
st.pop();
st.push(to_string(stoi(tmp) / 4));
continue;
}
st.push("4");
}
// while(!st.empty()) {
// cout << st.top();
// st.pop();
// cout << endl;
// }
// 스택 뒤집음....
stack<string> st2;
while(!st.empty()) {
st2.push(st.top());
st.pop();
}
// 덧셈 계산용
int res = stoi(st2.top());
st2.pop();
while(!st2.empty()) {
if (st2.top() == "+") {
st2.pop();
res += stoi(st2.top());
st2.pop();
}
else if (st2.top() == "-") {
st2.pop();
res -= stoi(st2.top());
st2.pop();
}
}
s += to_string(res);
// cout << s << endl;
ans[res + SUM] = s;
}
void repeatPermutation(vector<char> vec, vector<char> perm, int depth)
{
if (depth == perm.size())
{
solve(perm);
return;
}
for(int i = 0; i < vec.size(); i++)
{
perm[depth] = vec[i];
repeatPermutation(vec, perm, depth + 1);
}
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL);
const int r = 3;
vector<char> v = {'*', '+', '-', '/'};
vector<char> perm(r);
repeatPermutation(v, perm, 0);
int m;
cin >> m;
for (int i = 0; i < m; i++) {
int n;
cin >> n;
if (ans[n + SUM] == "") {
cout << "no solution\n";
continue;
}
cout << ans[n + SUM] << "\n";
}
return 0;
}
'백준' 카테고리의 다른 글
16654 Generalized German Quotation (0) | 2022.05.21 |
---|---|
1183 약속 (0) | 2022.05.14 |
19952 인성 문제 있어?? (0) | 2022.05.14 |
1013 Contact (0) | 2022.05.08 |
1034 램프 (0) | 2022.05.08 |