백준 14888 c++
#include <iostream>
using namespace std;
int N;
int* arr;
char* result;
char *char_op;
bool *visited;
int maximum = -1000000000, minimum = 1000000000;
int input(int lower, int upper)
{
//cout << "input()" << endl;
int A;
while (1)
{
cin >> A;
if (A >= lower && A <= upper)
{
break;
}
else
{
;
}
}
return A;
}
void input_arr(int* arr)
{
//cout << "input_arr()\n";
int i;
for (i = 0; i < N; i++)
{
arr[i] = input(1, 100);
}
return;
}
void input_op_arr(int op_arr[4])
{
//cout << "input_op_arr()\n";
int i, j = 0;
int count = 0;
while (1)
{
for (i = 0; i < 4; i++)
{
op_arr[i] = input(0, N-1);
count = count + op_arr[i];
}
if (count == N - 1)
{
break;
}
else
{
;//다시 입력
}
}
for (i = 0; i < op_arr[0]; i++)
{
char_op[j] = '+';
j++;
}
for (i = 0; i < op_arr[1]; i++)
{
char_op[j] = '-';
j++;
}
for (i = 0; i < op_arr[2]; i++)
{
char_op[j] = '*';
j++;
}
for (i = 0; i < op_arr[3]; i++)
{
char_op[j] = '/';
j++;
}
return;
}
int find_result(char* result)
{
//cout << "find_result()\n";
int i;
int total = 0;
total = arr[0];
for (i = 1; i < N; i++)
{
if (result[i-1] == '+')
{
total = total + arr[i];
}
else if (result[i-1] == '-')
{
total = total - arr[i];
}
else if (result[i-1] == '*')
{
total = total * arr[i];
}
else
{
total = total / arr[i];
}
}
//cout << total << "\n";
return total;
}
//입력받은 수들의 조합을 순서대로 연산함
// 수를 조합하니까 결과가 틀리는 경우가 발생함, 연산자의 조합을 해야함
//중복 허용안함, 순서 상관 없음
void dfs(int cnt)
{
//cout << "dfs()\n";
int i, j;
int value;
if (cnt == N - 1)
{
/*for (int i = 0; i < N - 1; i++)
{
cout << result[i] << " ";
}
cout << '\n';*/
value = find_result(result);
if (value > maximum)
{
maximum = value;
}
else
{
;
}
if (value < minimum)
{
minimum = value;
}
else
{
;
}
return;
}
else
{
for (i = 0; i < N - 1; i++)
{
if (visited[i] == false)
{
visited[i] = true;
result[cnt] = char_op[i];
dfs(cnt + 1);
visited[i] = false;
}
else
{
;
}
}
}
}
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int op_arr[4];
N = input(2, 11);
arr = new int[N] {0};
result = new char[N - 1] {0};
char_op = new char[N - 1];
visited = new bool[N] {0};
input_arr(arr);
input_op_arr(op_arr);
dfs(0);
cout << maximum << "\n" << minimum << "\n";
delete[] arr;
delete[] result;
delete[] char_op;
delete[] visited;
return 0;
}