알고리즘/구현 & 그리디 & 브루트포스

[백준]JAVA - 1541번: 잃어버린 괄호

K.두부 2022. 9. 15. 20:18
반응형

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

1541번: 잃어버린 괄호

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

www.acmicpc.net

풀이

이번 문제는 잘 이해한다면 쉽게 풀 수 있다고 생각한다.
55-50+40

어떻게 하면 최솟값을 만들 수 있을까? 최솟값을 만들려면 최대한 큰 값을 빼주면 된다. 즉, 덧셈을 먼저 진행한 후에 뺄셈을 진행하면 된다.

1. 공식에서 -로 분리한다.

String[] str = br.readLine().split("-");

2. 이후에 +를 분리해서 값을 더해준다.

for (int i=0; i<str.length; i++) {
    int temp = 0;
    // 뺄셈으로 나눈 토큰을 덧셈으로 분리해서 값을 더한다.
    String[] subStr = str[i].split("\\+");
            
    for (int j=0; j<subStr.length; j++) {
        temp += Integer.parseInt(subStr[j]);
    }
            
    if (sum == Integer.MAX_VALUE) sum = temp;
    else sum -= temp;
}

덧셈을 분리할 때 주의할 점이 한 가지 있다. split은 정규식을 받기 때문에 "+"를 해주면 regex.PatternSyntaxException을 발생시킨다. + 문자가 특별한 의미를 제공하고 있기 때문인데 이스케이프(\) 문자를 이용해서 특별한 의미를 없애고 문자 그 자체를 받아내면 된다. 하지만 백슬래쉬도 단독으로 사용할 수 없기 때문에 두 번을 사용해야 + 문자를 분리할 수 있다.

3. 분리를 완료했다면 마지막으로 첫 번째 값은 양수이기 때문에 먼저 sum에 넣은 후에 나머지 값들을 다 빼주면 된다.

<최종코드>

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        String[] str = br.readLine().split("-");
        int sum = Integer.MAX_VALUE;
        
        for (int i=0; i<str.length; i++) {
            int temp = 0;
            // 뺄셈으로 나눈 토큰을 덧셈으로 분리해서 값을 더한다.
            String[] subStr = str[i].split("\\+");
            
            for (int j=0; j<subStr.length; j++) {
                temp += Integer.parseInt(subStr[j]);
            }
            
            if (sum == Integer.MAX_VALUE) sum = temp;
            else sum -= temp;
        }
        
        System.out.println(sum);
    }
}
반응형