#include <cstdio>
#include <vector>
#include <queue>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <set>
#include <deque>
#include <numeric>
#include <map>
#define ll long long
using namespace std;
int N,ans=INT_MIN;
string s;
int calc(int a, int b, char c)
{
switch (c)
{
case '+': return a+b;
case '-': return a-b;
case '*': return a*b;
default : return 0;
}
}
void DFS(int idx, int tot){
if(idx >= s.length()){
ans = max(ans, tot);
return;
}
int val1 = calc(tot, s[idx+1]-'0', s[idx]);
DFS(idx+2, val1);
if(idx+3 < s.length()){
int val2 = calc(s[idx+1]-'0', s[idx+3]-'0', s[idx+2]);
int val3 = calc(tot, val2, s[idx]);
DFS(idx+4, val3);
}
return;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> N;
cin >> s;
DFS(1, s[0]-'0');
cout << ans;
return 0;
}
- 문제 풀이
- 최초 시도
: 모든 연산자 개수
중 우선순위 조합
을 만들어서 실행
하려 했으나 실행 코드를 짜지 못해 실패
(괄호가 겹치는 경우
의 우선순위를 찾는것
도 확실하지 않았음
)
- 결과
: 정답 풀이
를 참조
- (핵심)
현재 연산자
를 기준
으로 2가지 경우
를 수행
현재 연산자
를 기준
으로 괄호를 묶었을 경우
--> 현재 연산자를 기준
으로 앞 / 뒤에있는 숫자
에 대해 수행 후 DFS()
다음 연산자
를 기준
으로 괄호를 묶고
, 해당 결과
를 누적값
과 현재 연산자
로 계산
--> 다음 연산자
를 기준
으로 계산
한 뒤, 현재 연산자
를 처리
하고 DFS()
수행
ex) 3+8*7-9*2
에서
+
가 현재 연산자
일 때,
다음 연산자
인 *
을 괄호로 묶었다고 가정
하고 미리 연산을 수행
하면8*7=56
이고,
현재 연산자와 누적값(3
)을 계산하면 3+56=59
가 된다
- 주의
: max값을 저장
하는 ans변수의 초기값
이 INT_MIN
값을 가져야 함
(정답의 범위
가 최소 -2^31+1
이기 때문)