calculationPlus 메소드로 "+"가 모두 없어질 때까지 합연산을 실행한 뒤 "-"연산을 실행해 최솟값이 되도록 한다.
만약 최초 주어진 식이 "-"기호가 없다면 calculationPlus 메소드를 실행한 뒤의 값이 최솟값이므로 그대로 출력한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
public class Problem1541LostBracket_greedy {
//최초 식
static String initFormula;
//+가 있는 경우 +연산을 시행
private static void calculationPlus() {
while(initFormula.contains("+")){
//+의 인덱스
int plusIdx = initFormula.indexOf("+");
//+앞의 인덱스를 저장
int firstIdx = -1;
//+뒤의 인덱스를 저장
int secondIdx = -1;
for(int i=plusIdx-1; i >= 0; i--){
if(Character.isDigit(initFormula.charAt(i))){
firstIdx = i;
} else{
break;
}
}
for(int i=plusIdx+1; i < initFormula.length(); i++){
if(Character.isDigit(initFormula.charAt(i))){
secondIdx = i;
} else {
break;
}
}
//덧셈의 결과
int intAns = Integer.parseInt(initFormula.substring(firstIdx, plusIdx)) + Integer.parseInt(initFormula.substring(plusIdx+1, secondIdx+1));
String answer = Integer.toString(intAns);
//기존 식 변경
initFormula = initFormula.substring(0, firstIdx) + answer + initFormula.substring(secondIdx+1);
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
StringTokenizer st = new StringTokenizer(s, " ");
initFormula = st.nextToken();
//모든 덧셈 수행
calculationPlus();
//뺄셈 수행 후 출력
if(initFormula.contains("-")){
String[] temp = initFormula.split("-");
int answer = Integer.parseInt(temp[0]);
for(int i = 1; i < temp.length; i++){
answer = answer - Integer.parseInt(temp[i]);
}
System.out.println(answer);
} else {
//초기 식에 덧셈만 있어서 -가 없는 경우 그대로 출력
System.out.println(initFormula);
}
}
}
자바스크립트 라이브러리
import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
를 사용하면 문자열 식을 정수형으로 변환하지 않고 연산할 수 있다.
위 풀이와 같이 연산기호와 숫자를 복잡하게 분리하지 않고 split메소드로 간단하게 풀 수 있을 것 같다.
하지만 콘솔에서 버전 관련 경고를 표시하기 때문에 실제 풀이에서는 사용하지 못했다.