코테/백준

[백준/C++] 14888번: 연산자 끼워넣기

내꺼블로그 2024. 1. 27. 22:49

14888번: 연산자 끼워넣기


 

 

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

 

14888번: 연산자 끼워넣기

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

www.acmicpc.net

 

 

 

 

 

 

 

코드


 

#include<iostream>
#include<cmath>

using namespace std;

int operands[11];
int operators[4];
int n;

long long max_num = -1000000000;
long long min_num = 1000000000;

void dfs(int operands_idx, long long num)
{
	if (operands_idx == n) {
		max_num = max(max_num, num);
		min_num = min(min_num, num);
		return;
	}
	for (int i = 0; i < 4; i++) {
		if (operators[i] > 0) {
			long long temp = num;
			switch (i) {
			case 0:
				temp = num + (long long)operands[operands_idx];
				break;
			case 1:
				temp = num - (long long)operands[operands_idx];
				break;
			case 2:
				temp = num * (long long)operands[operands_idx];
				break;
			case 3:
				temp = num / (long long)operands[operands_idx];
				break;
			}
			operators[i]--;
			dfs(operands_idx + 1, temp);
			operators[i]++;
		}
	}
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> operands[i];
	}
	for (int i = 0; i < 4; i++) {
		cin >> operators[i];
	}
	dfs(1, operands[0]);
	cout << max_num << "\n";
	cout << min_num << "\n";
}

 

 

 

 

 

 

 

풀이


백트래킹을 사용하여 나올 수 있는 경우들을 모두 확인한다. dfs를 호출할 때마다 연산자(operator)를 순회하면서 사용할 수 있는 연산자를 발견하면 이를 이전 dfs에서 계산된 값(temp)과 현재 사용될 피연산자(operand) 연산에 사용하는 방식이다. dfs를 호출하기 전에 연산자를 사용했다는 의미로 operators[i]의 값을 1 줄이고(operators[i]--) dfs 이후 다 사용한 연산자를 되돌리는 의미로 operators[i] 값을 되돌려놓는다.(operators[i]++) 이와 같이 dfs처럼 갔다가 되돌아오는 방식으로 전체 경우를 확인하여 최댓값과 최솟값을 구한다. 최댓값과 최솟값은 operands_idx의 값이 n일 때 즉, 입력값으로 주어진 피연산자들을 다 돌았을 때 구하면 된다.

 

 

'코테 > 백준' 카테고리의 다른 글

[백준/C++] 9251번: LCS  (0) 2024.01.31