코딩테스트/백준

[백준 1541] 잃어버린 괄호 (Java)

imachill7guy 2025. 3. 7. 19:59

 

https://www.acmicpc.net/problem/1541

잃어버린 괄호

문제

세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.

그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.

괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.

입력

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다.

출력

첫째 줄에 정답을 출력한다.

예제 입력 1 복사

55-50+40

예제 출력 1 복사

-35

 


풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main (String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // eg. 55 - 50 + 40

        // '-' 기준으로 나눠서 담음
        //[55, 50 + 40]
        String[] numbers = br.readLine().split("-");

        for(int i=0; i<numbers.length; i++){
            if(numbers[i].contains("+")){
                int sum = 0;
                // + 가 있으면 묶어서 더해줌 (괄호 연산)
                String[] addNum = numbers[i].split("\\+");
                // [55, [50,40]]
                for(String addnum : addNum){
                    sum += Integer.parseInt(addnum);
                }
                // [55, 90]
                numbers[i] = Integer.toString(sum);
            }
        }

        int min = Integer.parseInt(numbers[0]);
        for(int i=1; i< numbers.length; i++){
            min -= Integer.parseInt(numbers[i]);
        }

        System.out.println(min);

    }
}
  • 해결 로직은 간결하나 문자열을 파싱하는 것이 까다로웠던 문제..
  • 최솟값을 만드는게 목표이므로 최대한 숫자를 +로 묶는다.
  • 연산식 자체가 문자열로 주어지므로 어떻게 파싱할 것인가가 관건이다.
    • 1번째로 "-"를 구분자로 분리하여 String 배열(numbers)에 담아준다.
    • " 55-50+40" -> [55, 50+40]
    • "-" 구분자로 분리하여 담은 numbers를 순회하면서 "+"를 포함한 원소가 있다면 모두 더해주는 연산을 수행한다.
    • "+"를 포함한 원소를 numbers[i]라고 가정했을 때, 다시 numbers[i]를 "+"를 구분자로 분리하여 String 배열에 담아준다.(addSum)
    • [55, 50+40] -> [55,[50,40]]
    • addSum을 순회하면서 숫자를 모두 더해준다. 그리고 더해준 최종값을 numbers[i] 자리에 update해준다.
    • 그렇게 되면 최종적으로 [55,90] 이런식으로 담기게된다.
    • 차례대로 순회하면서 빼주면 된다.
    • 55 -90 = -35