μ•Œκ³ λ¦¬μ¦˜

λ°±μ€€_14888_μ—°μ‚°μž λΌμ›Œλ„£κΈ° (브루트포슀-μž¬κ·€)

shj718 2022. 4. 18. 16:24

πŸ“Œ 문제: https://www.acmicpc.net/problem/14888

 

14888번: μ—°μ‚°μž λΌμ›Œλ„£κΈ°

첫째 쀄에 수의 개수 N(2 ≤ N ≤ 11)κ°€ 주어진닀. λ‘˜μ§Έ μ€„μ—λŠ” A1, A2, ..., AN이 주어진닀. (1 ≤ Ai ≤ 100) μ…‹μ§Έ μ€„μ—λŠ” 합이 N-1인 4개의 μ •μˆ˜κ°€ μ£Όμ–΄μ§€λŠ”λ°, μ°¨λ‘€λŒ€λ‘œ λ§μ…ˆ(+)의 개수, λΊ„μ…ˆ(-)의 개수, 

www.acmicpc.net

 

πŸ“Œ μ•Œκ³ λ¦¬μ¦˜: 브루트포슀-μž¬κ·€

 

πŸ“Œ idea: 숫자 μ‚¬μ΄μ˜ 각 μžλ¦¬μ— λŒ€ν•΄ μ΅œλŒ€ 4가지 경우(+,-,*,/)κ°€ μžˆμœΌλ―€λ‘œ 각 κ²½μš°μ— λŒ€ν•΄ μž¬κ·€ ν•¨μˆ˜ 호좜. (단, μ—°μ‚°μžμ˜ 개수λ₯Ό 확인할 것!)

 

πŸ“Œ μΆ”κ°€λ‘œ μ •λ¦¬ν•œ λ‚΄μš©:

- make_pair() ν•¨μˆ˜λŠ” utility 헀더에 μ •μ˜λ˜μ–΄μžˆμœΌλ‚˜ utility ν—€λ”λŠ” <vector>λ‚˜ <algorithm>에 ν¬ν•¨λ˜μ–΄μžˆμœΌλ―€λ‘œ λ”°λ‘œ <utility>λ₯Ό includeν•  ν•„μš”λŠ” μ—†λ‹€.

- for(auto element : array) μ‚¬μš©λ²•

 

πŸ’» μ½”λ“œ:

#include <iostream>
#include <vector>

using namespace std;

int N;
vector<int> arr;

pair<int, int> solve(int index, int result, int plus, int minus, int multi, int divide) {
	// μ •λ‹΅ λ§Œλ“  경우
	if (index == N) {
		return make_pair(result, result);
	}
	// λ‹€μŒ 호좜: 각 자리의 μ—°μ‚°μžκ°€ +, -, *, / 인 경우 각 4가지에 λŒ€ν•΄ 호좜
	// μ—°μ‚° κ²°κ³Όλ₯Ό μ €μž₯ν•  벑터 생성
	vector<pair<int, int>> res;
	if (plus > 0)
		res.push_back(solve(index + 1, result + arr[index], plus - 1, minus, multi, divide));
	if (minus > 0)
		res.push_back(solve(index + 1, result - arr[index], plus, minus - 1, multi, divide));
	if (multi > 0)
		res.push_back(solve(index + 1, result * arr[index], plus, minus, multi - 1, divide));
	if (divide > 0)
		res.push_back(solve(index + 1, result / arr[index], plus, minus, multi, divide - 1));
	// μ΅œλŒ€κ°’, μ΅œμ†Œκ°’ μ°ΎκΈ°
	pair<int, int> ans = res[0]; // ans: μ΅œλŒ€κ°’, μ΅œμ†Ÿκ°’μ˜ pair
	for (auto i : res) {
		if (ans.first < i.first) ans.first = i.first;
		if (ans.second > i.second) ans.second = i.second;
	}
	return ans;
}

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin >> N;
	int x;
	for (int i = 0; i < N; i++) {
		cin >> x;
		arr.push_back(x);
	}
	int plus, minus, multi, divide;
	cin >> plus >> minus >> multi >> divide;
	auto answer = solve(1, arr[0], plus, minus, multi, divide);
	cout << answer.first << '\n' << answer.second << '\n';
	return 0;
}