4 Jul 2020
2020카카오 인턴십 수식최대화
2020카카오 인턴십 수식최대화
public class Main {
static ArrayList<Integer> pri=new ArrayList<>();
static boolean[] visited=new boolean[3];
static String expression;
static long answer=0;
//연산자 우선순위
static Integer priority(char op){
int result=-1;
switch(op){
case '+':
result=pri.get(0);
break;
case '-':
result=pri.get(1);
break;
case '*':
result=pri.get(2);
break;
}
return result;
}
//중위순회 -> 후위순회 변환
static ArrayList<String> infixToPostfix(String exp){
Stack<Character> st=new Stack();
StringBuilder num=new StringBuilder();
ArrayList<String> pf=new ArrayList<>();
int len=exp.length();
for(int i=0;i<len;i++){
char ch=exp.charAt(i);
switch (ch){
case '+':
case '-':
case '*':
pf.add(num.toString());
num.delete(0,num.length());
while(!st.isEmpty()&&priority(ch)<=priority(st.peek())){
pf.add(String.valueOf(st.pop()));
}
st.push(ch);
break;
default:
num.append(ch);
break;
}
}
pf.add(num.toString());
while(!st.isEmpty()){
pf.add(String.valueOf(st.pop()));
}
return pf;
}
//숫자 인지 연산자인지 판별
static boolean isNum(String str){
if(str.equals("+")||str.equals("-")||str.equals("*")){
return false;
}
return true;
}
//후위식 계산
static long cal(ArrayList<String> pf){
Stack<Long> stack=new Stack<>();
for(String str:pf){
if(!isNum(str)){
long op2=stack.pop();
long op1=stack.pop();
switch (str){
case "+":
stack.push(op1+op2);
break;
case "-":
stack.push(op1-op2);
break;
case "*":
stack.push(op1*op2);
break;
}
}else{
stack.push(Long.valueOf(str));
}
}
return stack.pop();
}
//연산자의 우선순위 뽑기
static void dfs(int idx){
if(pri.size()==3){
answer=Math.max(answer,Math.abs(cal(infixToPostfix(expression))));
return;
}
for(int i=0;i<3;i++){
if(!visited[i]){
visited[i]=true;
pri.add(i);
dfs(i+1);
pri.remove(pri.size()-1);
visited[i]=false;
}
}
}
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
expression=sc.next();
dfs(0);
System.out.println(answer);
}
}