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);
    }
}


Tags:
0 comments