본문 바로가기

ProgramSoliving

프로그래머스 : 수식최대화 JAVA

반응형
import java.util.*;

class Solution {
    static String[][] combinations = {{"+","-","*"},{"+","*","-"},{"-","+","*"},{"-","*","+"},{"*","+","-"},{"*","-","+"}};
    
    public long solution(String expression) {
        String split[] = expression.split("(?<=[*/()+-])|(?=[*/+()-])");
        
        long answer = 0;
        
        for(String combination[] : combinations) {
            ArrayList<String> list = new ArrayList<>(Arrays.asList(split));
            
            for(String combi : combination) {
                ArrayList<String> next = new ArrayList<>();
                next.add(list.get(0));
                
                for(int i=1;i<list.size();i+=2) {
                    if(combi.equals(list.get(i))){
                        String prev = next.get(next.size() - 1);
                        String cur = calc(prev,list.get(i+1),list.get(i));
                        next.set(next.size() - 1, cur);
                    }else {
                        next.add(list.get(i));
                        next.add(list.get(i+1));
                    }
                }
                
                list = next;
            }
            
            long value = Long.parseLong(list.get(0));
            
            answer = Math.max(Math.abs(value),answer);
        }
        
        return answer;
    }
    
    public static String calc(String num1, String num2, String ch) {
        switch(ch) {
            case "+":
                return (Long.parseLong(num1) + Long.parseLong(num2))+"";
            case "-":
                return (Long.parseLong(num1) - Long.parseLong(num2))+"";
            case "*":
                return (Long.parseLong(num1) * Long.parseLong(num2))+"";
            default:
                return "";
        }
    }
}

 

숫자와 사칙 연산을 분리하는 정규표현식은 (?<=[*/()+-])|(?=[*/+()-]) 입니다.

 

이 방법으로 String 문자열을 ArrayList로 분리합니다.

 

분리된 ArrayList를 세개의 사칙연산 우선순위에 따라 먼저계산합니다.

 

이때 계산된 ArrayList를 합쳐진 List로 관리합니다.

반응형