Doby's Lab

[알고리즘] 백준 15658번: 연산자 끼워넣기 (2) (C++) 본문

PS/BOJ

[알고리즘] 백준 15658번: 연산자 끼워넣기 (2) (C++)

도비(Doby) 2021. 11. 28. 13:56

https://www.acmicpc.net/problem/15658

 

15658번: 연산자 끼워넣기 (2)

N개의 수로 이루어진 수열 A1, A2, ..., AN이 주어진다. 또, 수와 수 사이에 끼워넣을 수 있는 연산자가 주어진다. 연산자는 덧셈(+), 뺄셈(-), 곱셈(×), 나눗셈(÷)으로만 이루어져 있다. 연산자의 개수

www.acmicpc.net

연산자 배열을 선언 후 각 연산자를 고른 경우 총 4가지를 가지고서 백트래킹 하면 된다.

#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;

int n;
vector<int> num;
int oper[4] = { 0, };
int maxValue = INT_MIN;
int minValue = INT_MAX;

void backTrack(int cnt, int sum) {
	if (cnt == n) {
		maxValue = max(maxValue, sum);
		minValue = min(minValue, sum);

		return;
	}

	for (int i = 0; i < 4; i++) {
		if (i == 0 && oper[i] > 0) {
			oper[i] -= 1;
			backTrack(cnt + 1, sum + num[cnt]);
			oper[i] += 1;
		}
		else if (i == 1 && oper[i] > 0) {
			oper[i] -= 1;
			backTrack(cnt + 1, sum - num[cnt]);
			oper[i] += 1;
		}
		else if (i == 2 && oper[i] > 0) {
			oper[i] -= 1;
			backTrack(cnt + 1, sum * num[cnt]);
			oper[i] += 1;
		}
		else if (i == 3 && oper[i] > 0) {
			oper[i] -= 1;
			backTrack(cnt + 1, sum / num[cnt]);
			oper[i] += 1;
		}
	}
}

int main() {
	cin >> n;
	int value;
	for (int i = 0; i < n; i++) {
		cin >> value;
		num.push_back(value);
	}

	for (int i = 0; i < 4; i++) {
		cin >> oper[i];
	}

	backTrack(1, num[0]);

	cout << maxValue << '\n';
	cout << minValue;
	return 0;
}