λ¬Έμμ΄μ μ΄λ»κ² μ²λ¦¬ν κΉ κ΅μ₯ν λ§μ΄ κ³ λ―Όνλ λ¬Έμ μλ€.
μ κ·μμ μ¬μ©νλκ² μ½λκ° λ κ°κ²°ν΄μ§ κ² κ°μμ μ κ·μμ μ¬μ©νλ€.
κ·Έλ¦¬κ³ , μ°μ°μλ + - * 3κ°λ§ μ£Όμ΄μ§κΈ° λλ¬Έμ, μ°μ°μ μ°μ μμλ₯Ό μ§μ λͺ μν΄μ μ μΈν΄μ£Όμλ€.
"*+-","+*-","*-+","+-*","-*+","-+*"
μμ κ°μ 6κ°μ§ κ²½μ°κ° μμ μ μλ€.
λ¨Όμ μ κ·μ "\\d+|\\S" λ₯Ό μ¬μ©νλ©΄, μ«μμ μ°μ°μλ‘ λλ μ μλ€.
κ·Έλ¦¬κ³ , μ κ·μμ λ°νμΌλ‘ λΆλ¦¬ν μμλ€μ, μννλ©΄μ μ«μλΌλ©΄ μ€νμ μ§μ΄λ£κ³ , μ°μ°μμ΄λ©΄μ μ°μ μμμ ν΄λΉνλ μ°μ°μλΌλ©΄ μ€νμ μλ μ«μλ₯Ό λΉΌμ μ°μ°μ²λ¦¬ ν λ€, λ£μ΄λλ λ°©μμΌλ‘ ννμμ λ³νμμΌ°λ€.
μ°μ μμκ° "*+-" λΌκ³ κ°μ νμλ "100-200*300-500+20" μ΄ μμ
"100-60000-500+20" μΌλ‘ λ³νλκ³ "100-60000-520" μ΄ λ³νλκ³ "-60420" μ΄ λλ κ²μ΄λ€.
λ€λ§, μ¬κΈ°μ μ£Όμν μ μ΄ μλλ°
λ§μ½ "100-200*300-500+20" μ΄ μμμ "-" μ°μ°μ λ¨Όμ μννλ©΄
"-100*-200+20" μ΄ λκ³ μ΄ μμ λ€μ "\\d+|\\S" μ΄ μ κ·μμ μ¬μ©νκ² λλ©΄
[ - , 100 , * , - , 200 , + , 20 ] μ κ°μ΄ λΆλ¦¬κ° λλ€λ μ μ΄λ€.
λ°λΌμ, - μ°μ°μ΄ μνλκ³ λμλ νΌμ°μ°μκ° μμκ° λλ κ²½μ°κ° μκΈ°λ―λ‘, μ κ·μμ "-?\\d+|\\S" λ₯Ό μ¬μ©ν΄μΌ μλ¬λ₯Ό λ°©μ§ν μ μμλ€.
μ κ·μμ κ°λ΅νκ² μ€λͺ νλ©΄,
-? λ - κΈ°νΈκ° μμ μλ μμ μλ μμμ λνλΈλ€. (μλ κ²½μ° μ΅λ 1κ°)
\\d+ λ μ°μλ μ«μλ₯Ό λνλ΄κ³
| λ λλ μ λνλ΄κ³
\\S λ κ³΅λ°±μ΄ μλ λ¬Έμλ₯Ό λνλΈλ€.
import java.util.*;
import java.util.regex.*;
class Solution {
Deque<String> q;
public long solution(String expression) {
long answer = 0;
q = new ArrayDeque<>();
String[] pri = {"*+-","+*-","*-+","+-*","-*+","-+*"};
for(int i=0;i<pri.length;i++){
boolean flag = true;
String[] ops = pri[i].split("");
String ex = expression;
for(int j=0;j<ops.length;j++){
String op = ops[j];
Pattern p;
Matcher m;
if(flag){
p = Pattern.compile("\\d+|\\S");
m = p.matcher(ex);
}else{
p = Pattern.compile("-?\\d+|\\S");
m = p.matcher(ex);
}
if(op.equals("-")){
flag = false;
}
while(m.find()){
String s = m.group();
if(s.equals(op)){
m.find();
q.offer(String.valueOf(getValue(q.pollLast(),m.group(),op)));
}else{
q.offer(s);
}
}
ex = toEx();
}
answer = Math.max(answer,Math.abs(Long.parseLong(ex)));
}
return answer;
}
long getValue(String num1,String num2,String op){
long n1 = Long.parseLong(num1);
long n2 = Long.parseLong(num2);
if(op.equals("*")){
return n1*n2;
}else if(op.equals("+")){
return n1+n2;
}else{
return n1-n2;
}
}
String toEx(){
StringBuilder sb = new StringBuilder();
for(String str : q){
sb.append(str);
}
q.clear();
return sb.toString();
}
}