Coding Test/Baekjoon

백준/1541번/Java - 잃어버린 괄호

grogu.... 2023. 10. 5. 22:40

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

 

1541번: 잃어버린 괄호

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

www.acmicpc.net


수식이 주어지고 괄호를 어떻게 쳐야 수식의 결과가 최소가 나오는지 묻는 문제.

 

10+20+30+40의 최소가 100인 것으로 보아 숫자를 쪼개서 괄호를 넣을 수는 없다.

 

단순히 덧셈과 뺄셈만으로 이루어진 연산이므로 결과가 가장 작으려면, 가능한 큰 수를 빼야 한다.

+, - 부호가 하나만 나타나는 것이 아니므로 가능한 큰 수를 빼기 위해서는 - 부호가 나타나면 괄호를 열고, 또 - 부호가 나타나면 괄호를 닫은 뒤 다시 열어줘야 한다.

 

50 + ... + 20 - (10 + 30 + ...20 )-(45 + ...) 와 같은 방식으로 괄호가 들어가야 한다.

따라서 -를 기준으로 문자열을 split하고, - 기준으로 split한 문자열을 다시 +를 기준으로 split해 Integer로 형변환을 하여 연산을 해주면 된다.

 

import java.io.*;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        /*
        + - 로만 이루어진 수식의 값을 최소로 만들기 위해서는
        가능한 큰 수를 빼야 함.
        즉 - 부호 뒤에 괄호로 감싸지는 수가 최대한 크면 됨
        -부호를 만나면 괄호를 열고 또 다른 마이너스 부호가 나오거나 수식의 끝에 도착할 때 괄호를 닫는다
        따라서 - 부호를 기준으로 문자열을 split하고, 첫 번째 문자열을 계산한 값에서 나머지 문자열을 계산한 값을 뺴면 됨
         */
        int answer = 0;
        String s = br.readLine();
        String[] split = s.split("-");

        for(int i=0; i<split.length; i++) {
            if(i == 0) {
                answer += sum(split[0]);
            } else {
                answer -= sum(split[i]);
            }
        }

        System.out.println(answer);

        br.close();

    }

    private static int sum(String str) {
        //입력받은 덧셈 수식 문자열을 계산함
        int result = 0;
        String[] split = str.split("\\+");

        for(String s : split) {
            result += Integer.parseInt(s);
        }
        return result;
    }
}