Study hard

(c++)백준 15658번: 연산자 끼워넣기 (2) 본문

백준/브루트 포스

(c++)백준 15658번: 연산자 끼워넣기 (2)

Nimgnoej 2020. 8. 13. 10:47

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

 

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

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

www.acmicpc.net

[풀이]

14888번 연산자 끼워넣기와 똑같은 풀이이다.

2020/08/13 - [백준/브루트 포스] - (c++)백준 14888번: 연산자 끼워넣기

 

(c++)백준 14888번: 연산자 끼워넣기

https://www.acmicpc.net/problem/14888 14888번: 연산자 끼워넣기 첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의..

nim-code.tistory.com

#include <iostream>
#include <vector>
#include <algorithm>//min,max
using namespace std;

int N;
vector<int>A(11);//N개의 수
int op[4];//각 연산자의 개수 (0:+, 1:-, 2:*, 3:/)
vector<int>v;//식에 쓸 연산자 순서대로 넣기
int Min = 10e10;
int Max = -10e10;

int Calc() {
	int res = A[0];
	for (int i = 0; i < N - 1; i++) {
		//덧셈일 경우
		if (v[i] == 0) {
			res += A[i + 1];
		}
		//뺄셈일 경우
		else if (v[i] == 1) {
			res -= A[i + 1];
		}
		//곱셈일 경우
		else if (v[i] == 2) {
			res *= A[i + 1];
		}
		//나눗셈일 경우
		else if (v[i] == 3) {
			res /= A[i + 1];
		}
	}
	return res;
}

//연산자 나열하는 모든 경우 구하기
void getSet(int cnt) {
	if (cnt == N - 1) {
		int res = Calc();
		Min = min(Min, res);
		Max = max(Max, res);
		return;
	}

	if (op[0] > 0) {
		op[0]--;
		v.push_back(0);
		getSet(cnt + 1);
		v.pop_back();
		op[0]++;
	}

	if (op[1] > 0) {
		op[1]--;
		v.push_back(1);
		getSet(cnt + 1);
		v.pop_back();
		op[1]++;
	}

	if (op[2] > 0) {
		op[2]--;
		v.push_back(2);
		getSet(cnt + 1);
		v.pop_back();
		op[2]++;
	}

	if (op[3] > 0) {
		op[3]--;
		v.push_back(3);
		getSet(cnt + 1);
		v.pop_back();
		op[3]++;
	}
}

void solution() {
	cin >> N;
	for (int i = 0; i < N; i++) {
		cin >> A[i];
	}
	for (int i = 0; i < 4; i++) {
		cin >> op[i];
	}
	getSet(0);
	cout << Max << '\n';
	cout << Min << '\n';
}

int main() {
	solution();
	return 0;
}