14888번: 연산자 끼워넣기
https://www.acmicpc.net/problem/14888
코드
#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 |
---|