Algorithm/BOJ
[백준] 14888번 연산자 끼워넣기
면빈이
2019. 11. 8. 17:15
[적용한 알고리즘]
재귀, 브루트포스
[아이디어]
경우의 수를 세보니 다 해볼만 하더라.
[생각의 흐름 / 절차]
다 해볼만 함
필요한 인수 정리
제한 조건 써주기
[교훈]
재귀를 더 조져보자.
<코드>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int n;
vector<int> res;
void go(vector<int> &arr, int idx, int cur, int pl, int mi, int mul, int div){
if (idx == n){
res.push_back(cur);
return;
}
if (pl > 0) go(arr, idx + 1, cur + arr[idx], pl - 1, mi, mul, div);
if (mi > 0) go(arr, idx + 1, cur - arr[idx], pl, mi - 1, mul, div);
if (mul > 0) go(arr, idx + 1, cur * arr[idx], pl, mi, mul - 1, div);
if (div > 0) go(arr, idx + 1, cur / arr[idx], pl, mi, mul, div - 1);
}
int main(){
scanf("%d", &n);
vector<int> arr(n);
for (int i = 0; i < n; i++){
scanf("%d", &arr[i]);
}
int oper[4];
for (int i = 0; i < 4; i++){
scanf("%d", &oper[i]);
}
go(arr, 1, arr[0], oper[0], oper[1], oper[2], oper[3]);
int ans_min = 1000000005;
int ans_max = -1000000005;
for (int x : res){
ans_min = min(ans_min, x);
ans_max = max(ans_max, x);
}
printf("%d\n%d", ans_max, ans_min);
return 0;
}