문제 : https://www.acmicpc.net/problem/14888


[알고리즘풀이]

백트레킹 기법을 이용하여, 가능한 모든 경우에 대해서 수식을 만들어 계산을 해본다.

( 0 : + , 1 : - , 2 : * , 3 : / 를 의미 )

#include<iostream>
#include<vector>

using namespace std;

int ma = -1000000001, mi = 1000000001;

void bt(int, vector<int>, vector<int>, vector<int>);

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(0);

	int n;
	cin >> n;
	vector<int> v(n), o(4), k;
	for (int i = 0; i < n; i++)
		cin >> v[i];
	for (int i = 0; i < 4; i++)
		cin >> o[i];
	bt(0, v, o, k);
	cout << ma << '\n' << mi;
}

void bt(int n, vector<int> v, vector<int> o, vector<int> k) {
	if (n == v.size() - 1) {
		int temp = v[0];
		for (int i = 0; i < k.size(); i++) {
			if (k[i] == 0) {
				temp += v[i + 1];
			}
			else if (k[i] == 1) {
				temp -= v[i + 1];
			}
			else if (k[i] == 2) {
				temp *= v[i + 1];
			}
			else {
				temp /= v[i + 1];
			}
		}
		if (temp < mi)
			mi= temp;
		if (temp > ma)
			ma = temp;
		return;
	}
	for (int i = 0; i < 4; i++) {
		if (o[i] != 0) {
			o[i]--;
			k.push_back(i);
			bt(n + 1, v, o, k);
			k.pop_back();
			o[i]++;
		}
	}
	return;
}

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ] 4355 - Relatives  (2) 2019.09.23
[BOJ] 14889 - 스타트와 링크  (0) 2019.09.21
[BOJ] 2580 - 스도쿠  (0) 2019.09.21
[BOJ] 2981 - GRANICA  (0) 2019.09.21
[BOJ] 1182 - 부분수열의 합  (0) 2019.09.20

+ Recent posts