> 문제
문제 : [수식 최대화]
> 문제풀이
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