문제 링크: https://www.acmicpc.net/problem/14888
백트래킹+브루트포스 문제입니다. 별로 고려할 건 없고.. 그냥 모든 경우의 수에 직접 계산해봐야 합니다. 연산자 우선순위같은건 없고 앞에서부터 뒤로 선입선출로 계산하면 됩니다
#include <bits/stdc++.h>
using namespace std;
int n;
int min_res, max_res;
vector<int> nums;
void calc(vector<char>& ops, int remain_plus, int remain_minus, int remain_mul, int remain_div) {
if (remain_plus == 0 && remain_minus == 0 && remain_mul == 0 && remain_div == 0) {
int ret = nums[0];
for (int i = 0; i < n - 1; ++i) {
switch (ops[i]) {
case '+':
ret += nums[i + 1];
break;
case '-':
ret -= nums[i + 1];
break;
case '*':
ret *= nums[i + 1];
break;
case '/':
ret /= nums[i + 1];
break;
}
}
min_res = min(min_res, ret);
max_res = max(max_res, ret);
return;
}
if (remain_plus) {
ops.push_back('+');
calc(ops, remain_plus-1, remain_minus, remain_mul, remain_div);
ops.pop_back();
}
if (remain_minus) {
ops.push_back('-');
calc(ops, remain_plus, remain_minus-1, remain_mul, remain_div);
ops.pop_back();
}
if (remain_mul) {
ops.push_back('*');
calc(ops, remain_plus, remain_minus, remain_mul-1, remain_div);
ops.pop_back();
}
if (remain_div) {
ops.push_back('/');
calc(ops, remain_plus, remain_minus, remain_mul, remain_div-1);
ops.pop_back();
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
min_res = INT_MAX;
max_res = INT_MIN;
cin >> n;
nums = vector<int>(n);
for (auto& c : nums)
cin >> c;
int pl, mi, mu, di;
cin >> pl >> mi >> mu >> di;
vector<char> vc;
calc(vc, pl, mi, mu, di);
cout << max_res << '\n' << min_res << '\n';
return 0;
}
컨디션이 안좋아서 그런지 코드가 넘 극혐이네요 ;;;; 여러분은 이렇게 짜지 마십쇼
넘피곤하니 리팩토링은 언젠가 하는걸로..
반응형
'Online Judge > 백준' 카테고리의 다른 글
[백준][C++] 19235: 모노미노도미노 (4) | 2020.07.13 |
---|---|
[백준][C++] 9663: N-Queen (0) | 2020.07.13 |
[백준][C++] 17135: 캐슬 디펜스 (0) | 2020.07.12 |
[백준][C++] 17070: 파이프 옮기기 1 (0) | 2020.07.12 |
[백준][C++] 1931: 회의실배정 (0) | 2020.07.12 |