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