본문 바로가기

알고리즘/SWEA

4088

static int N, maximum, minimum;
static int ops[4]; //0: +, 1: -, 2: *, 3: /
static int numbers[12];
static int sel[11];

static void __solution(int idx, int st)
{
	if (idx == 4)
	{
		int v = numbers[0];
		for (int i = 0, j = 1; i < N - 1; i++, j++)
		{
			switch (sel[i])
			{
			case 0:
				v += numbers[j];
				break;
			case 1:
				v -= numbers[j];
				break;
			case 2:
				v *= numbers[j];
				break;
			case 3:
				v /= numbers[j];
				break;
			}
		}

		if (v > maximum)
			maximum = v;
		if (v < minimum)
			minimum = v;

		return;
	}

	if (!ops[idx])
		__solution(idx + 1, 0);
	else
	{
		ops[idx] -= 1;
		for (int s = st; s < N - 1; s++)
		{
			if (sel[s] < 0)
			{
				sel[s] = idx;
				__solution(idx, s + 1);
				sel[s] = -1;
			}
		}
		ops[idx] += 1;
	}
}

static int solution(void)
{
	scanf("%d", &N);
	for (int i = 0; i < 4; i++)
		scanf("%d", &ops[i]);
	for (int i = 0; i < N; i++)
		scanf("%d", &numbers[i]);

	memset(sel, -1, sizeof(sel));
	maximum = -100000001;
	minimum = 100000001;

	__solution(0, 0);

	memset(ops, 0, sizeof(ops));
	memset(numbers, 0, sizeof(numbers));
	return maximum - minimum;
}

연산자를 같은 것이 있는 순열로 생각하여 구현을 하였다.

그래서 일단 연산자를 나열 할 수 만 있다면 나머지는 계산만 하면 되므로 간단히 풀 수 있다.

'알고리즘 > SWEA' 카테고리의 다른 글

1952  (0) 2021.11.03
6959  (0) 2021.11.03
5644  (0) 2021.11.03
8275  (0) 2021.11.03
6781  (0) 2021.11.03