No Rules Rules

연산자 끼워넣기 (feat. 백준, 14888번) 본문

생활/코테

연산자 끼워넣기 (feat. 백준, 14888번)

개발하는 완두콩 2022. 8. 5. 21:55
728x90
반응형

연산자 끼워넣기
https://www.acmicpc.net/problem/14888

 

14888번: 연산자 끼워넣기

첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 

www.acmicpc.net

반응형
// woohyeon.kim
// https://www.acmicpc.net/problem/14888
#include <iostream>
using namespace std;
int N, arr[11], sign[10], tmp[10], min_ans, max_ans;
bool chk[10];
void dfs(register int count) {
	if (count == (N - 1)) {
		register int ans = arr[0];
		for (register int i = 1; i < N; ++i) {
			if (tmp[i - 1] == 1)		ans += arr[i];
			else if (tmp[i - 1] == 2)	ans -= arr[i];
			else if (tmp[i - 1] == 3)	ans *= arr[i];
			else						ans /= arr[i];
		}
		min_ans = min(min_ans, ans), max_ans = max(max_ans, ans);
		return;
	}
	for(register int i = 0; i < N - 1; ++i)
		if (!chk[i]) {
			chk[i] = true;
			tmp[count] = sign[i];
			dfs(count + 1);
			chk[i] = false;
			tmp[count] = 0;
		}
}
int main() {
	ios::sync_with_stdio(false), cin.tie(NULL);
	cin >> N;
	for (register int i = 0; i < N; ++i)
		cin >> arr[i], chk[i] = false;
	for (register int i = 0, v, idx = 0; i < 4; ++i) {
		cin >> v;
		while (v--)
			sign[idx++] = i + 1;
	}
	min_ans = static_cast<int>(1e9), max_ans = -static_cast<int>(1e9);
	dfs(0);
	cout << max_ans << "\n" << min_ans;
	return 0;
}
// *&)*@*

연산자에 대해서 모든 순열을 구하고, 각각의 순열대로 연산 후 최소값, 최대값을 구하는 방식입니다.

단, 최대값은 초기 0으로 하면 연산자가 하나만 있고 음수인 경우, 항상 0으로만 출력되기 때문에 조심해야 합니다.

728x90
반응형

'생활 > 코테' 카테고리의 다른 글

LCS (feat. 백준, 9251번)  (0) 2022.08.05
신나는 함수 실행 (feat. 백준, 9184번)  (0) 2022.08.05
스도쿠 (feat. 백준, 2580번)  (0) 2022.08.05
N-Queen (feat. 백준, 9663번)  (0) 2022.08.05
N과 M (4) (feat. 백준, 15652번)  (0) 2022.08.05
Comments