ProgramSoliving
프로그래머스 : 수식최대화 JAVA
하이후에호
2021. 9. 6. 02:32
반응형
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로 관리합니다.
반응형