백준 14888 c++

magicdrill·2024년 4월 10일

백준 문제풀이

목록 보기
282/673

백준 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;
}

0개의 댓글