https://www.acmicpc.net/problem/1541
세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.
그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.
괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.
<입력>
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다.
- 가장 작은 수가 나오는 것은 다 빼버리는 것
- "-"를 기준으로 나눈 후, 양쪽은 다 파싱하여 합을 만들어주고
- 그 합들로 - 계산을 한다.
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));
String input = br.readLine();
String[] calculate = input.split("-");
int len = calculate.length;
int[] answer = new int[len];
for(int i = 0; i < len; i++) {
String[] arr = calculate[i].contains("+") ? calculate[i].split("\\+") : new String[] {calculate[i]};
int num = 0;
for(int j = 0; j < arr.length; j++) {
num += Integer.parseInt(arr[j]);
}
answer[i] = num;
}
int min = answer[0];
for(int i = 1; i < len; i++) {
min -= answer[i];
}
System.out.println(min);
}
}
Java에서 split()을 사용하면 문자열을 자를 수 있다. 입력받은 정규 표현식 또는 특정 문자를 기준으로 문자열을 나누어 배열 형태로 return한다.
두 번째 인자로는 int형으로 배열의 크기를 지정할 수 있다.
String str = "010-1234-5678"
String[] num = str.split("-");
//String[] num은 {"010", "1234", "5678"} 이렇게 나온다.
String[] arr = str.split("-"), 2);
//String[] arr은 {"010", "1234-5678"} 이렇게 나온다.
위의 풀이에서 "+"는 정규 표현식에서 앞의 문자가 '하나 이상' 존재해야 한다라는 뜻을 가지고 있다. 예를 들어, a+는 "a" "aa" "aaa"와 일치한다.
위에 적혀있듯이 split은 정규 표현식을 기반으로 문자열을 분리한다. 따라서 "+"를 전달하면 정규식으로 인식되어 Error가 나서 원하는 대로 분리되지 않는다.
입출력 시 사용할 수 있는 커서 이동 및 출력 불가 문자들을 말한다.
역슬래시(\)와 조합하여 사용하며, 글꼴에 따라 원화 표시 \로 나올 수 있다.

(출처: https://wikidocs.net/189455)
즉, "+" 문자는 이스케이프 처리를 해줌으로써 "+" 그 자체로 인식할 수 있도록 해야 한다.
왜 \\ 두 번을 써야 할까?
Java에서 \를 나타내기 위해서 \\를 사용하고, \\+는 \+로 표현되고, 이는 정규 표현식에서 "+" 문자를 의미하게 되어 동작한다.