백준 1541번: 잃어버린 괄호

풀이

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메소드로 간단하게 풀 수 있을 것 같다.
하지만 콘솔에서 버전 관련 경고를 표시하기 때문에 실제 풀이에서는 사용하지 못했다.

좋은 웹페이지 즐겨찾기