알고리즘
BOJ 16637: 괄호 추가하기
minbear
2023. 8. 2. 20:05
#BOJ 16637: 괄호 추가하기
16637번: 괄호 추가하기
첫째 줄에 수식의 길이 N(1 ≤ N ≤ 19)가 주어진다. 둘째 줄에는 수식이 주어진다. 수식에 포함된 정수는 모두 0보다 크거나 같고, 9보다 작거나 같다. 문자열은 정수로 시작하고, 연산자와 정수가
www.acmicpc.net
#풀이
괄호를 추가해서 최대값을 찾는 문제이다.
맨 처음엔 조건문으로 해결하려다가 n의 크기가 그렇게 크지 않아 dfs를 재귀함수로 만들어 사용하였다.
괄호를 안칠 때
괄호를 칠 때
인덱스가 0일 때
위에 조건문을 사용하여 재귀함수를 사용하여 풀었다.
또한 가장 큰 값이 음수가 나올 수 있으므로 ans는 가장 작은 수로 해야한다.
#코드
#include<bits/stdc++.h>
using namespace std;
int n;
int ans = -0x3f3f3f3f;
string str;
int oper(int a, int b, char op){
int sum = 0;
if(op == '+')
sum += a + b;
else if(op == '-') sum += a-b;
else sum+= a* b;
return sum;
}
void back_func(int idx, int cur){
if(idx >= n)
{
ans = ans < cur ? cur : ans;
return;
}
if(idx== 0)
{
back_func(idx+1, oper(str[idx]-'0', 0, '+')); //괄호 x
back_func(idx+3, oper(str[idx]-'0', str[idx+2]-'0', str[idx+1]));//괄호 o
}
if(idx != 0){
if(idx + 3 < n){
back_func(idx+4, oper(cur, oper(str[idx+1] -'0', str[idx+3] -'0', str[idx+2]), str[idx]));
}
back_func(idx+2, oper(cur, str[idx+1]-'0', str[idx]));
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
cin >> str;
back_func(0, 0);
cout << ans << '\n';
return 0;
}