[프로그래머스] Level2 - 수식 최대화

 
by 박신종

> 문제

문제 : [수식 최대화]



> 문제풀이

3크기의 연산자 우선순위 배열을 만들었다.

인덱스는 우선순위를 나타내며 0이 가장 높은 우선순위를 가진다.

순열의 swap으로 우선순위를 변경하였으며, 우선순위가 가장 큰 피연산자를 먼저 연산을 먼저 하였다.


import java.util.*;
class Solution {
    static public long solution(String expression) {
        char[] op = new char[3];  // operation priority
        op[0] = '*';
        op[1] = '+';
        op[2] = '-';
        permutation(0, op, expression);
        return res;
    }
    static Long res = Long.MIN_VALUE;
    static void permutation(int depth, char[] op, String expression){
        if(depth == 3){
            List<Object> list = makeList(expression);
            for(int i=0; i<3; i++){ // 우선순위가 큰 피연선자부터 연산.
                for(int j=1; j<list.size(); j+=2){
                	if(list.size() < 3) break;
                    if((char) list.get(j) == op[i]){
                        Long a = (Long) list.remove(j-1);
                        char o = (char) list.remove(j-1);
                        Long b = (Long) list.remove(j-1);
                        list.add(j-1, operation(a,b,o));
                        j-=2;
                    }
                }
            }
            Long tmp = Math.abs((Long) list.get(0));
            if(res < tmp) res = tmp;
        }
        for(int i=depth; i<3; i++){
            swap(depth, i, op);	// 피연산자 우선순위 변경
            permutation(depth+1, op, expression);
            swap(depth, i, op);
        }
    }
  
  	static List<Object> makeList(String expression){
        List<Object> list = new LinkedList<>();
        StringBuilder sb = new StringBuilder();
        for(int i=0; i<expression.length(); i++){
            char c = expression.charAt(i);
            if( c == '*' || c == '-' || c == '+'){
                list.add(Long.parseLong(sb.toString()));
                list.add(c);
                sb = new StringBuilder();
            }else{
                sb.append(c);
            }
        }
        list.add(Long.parseLong(sb.toString()));
        return list;
    }
    static Long operation(Long a, Long b, char o){
        if(o == '*') return a*b;
        else if(o == '+') return a+b;
        else return a-b;
    }
    static void swap(int a, int b, char[] arr){
        char tmp = arr[a];
        arr[a] = arr[b];
        arr[b] = tmp;
    }
}




문제 출처 : Programmers