잃어버린 괄호
시간 제한메모리 제한제출정답맞은 사람정답 비율
2 초 | 128 MB | 35632 | 16846 | 13602 | 47.219% |
문제
세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.
그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.
괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.
입력
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다.
출력
첫째 줄에 정답을 출력한다.
풀이
최소값을 만들기 위해서 '-'를 활용해야 한다.
마이너스 -가 나온 뒤 다음 -를 만나기 전까지 최대한 빼주어야 한다. 예를 든다면 다음과 같다.
10 + 20 + 30 - 40 - 50 + 30 + 40 + 60 - 20 + 30 + 20 - 10 가 주어진다면
10 + 20 + 30 - 40 - (50 + 30 + 40 + 60) - (20 + 30 + 20) - 10가 최소값이 될 것이다. 일반화하면
10 + 20 + 30 - (40) - (50 + 30 + 40 + 60) - (20 + 30 + 20) - (10)와 같이 나타낼 수 있다.
결국 -가 한개라도 나타나는 시점부터 +든 -든 모두 - 연산에 포함된다는게 포인트다.
10 + 20 + 30 -(40 + 50 + 30 + 40 + 60 + 20 + 30 + 20 + 10)
값을 저장하기
위 예시를 '-'를 기준으로 값을 쪼개서 저장하면 다음과 같다
[10+20+30] [40] [50+30+40+60] [20+30+20] [10]
앞부분을 더하는지 빼주는지 사실 알 길이 없다. 그래서 최초의 -를 찾고 그 부호를 기준으로 왼쪽 오른쪽을 나누어 가져온다.
index[0]부터 탐색해 최초의 -를 찾는 즉시 반복문을 종료하고 해당 index를 기준으로 나누어 저장한다
import java.io.*;
import java.util.StringTokenizer;
public class Main {
static int[] arr;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
int index=-1;
int sum=0;
String plus,minus="";
if(s.contains("-")) { // -를 포함하고 있다면 plus와 minus를 나누어 저장한다
index=s.indexOf("-");
minus=s.substring(index);
plus=s.substring(0,index);
} else plus=s;
StringTokenizer st = new StringTokenizer(plus,"+");
while(st.hasMoreTokens()) { //plus 부분 나눠주기
String s1 = st.nextToken();
int i=0;
while(s1.charAt(i)=='0') { //처음부분이 0이 아닌 곳부터 값을 가져온다
i++;
}
sum+=Integer.parseInt(s1.substring(i, s1.length()));
}
st = new StringTokenizer(minus,"+|-"); //+와 - 모든 기호를 기준으로 쪼갠다
while(st.hasMoreTokens()) {
String s1 = st.nextToken();
int i=0;
while(s1.charAt(i)=='0') {
i++;
}
sum-=Integer.parseInt(s1.substring(i, s1.length()));
}
System.out.print(sum);
}}
'Study > Baekjoon' 카테고리의 다른 글
Baekjoon2750,2751: 수 정렬하기(Scanner, Buffer) (0) | 2021.11.03 |
---|---|
Baekjoon13305*: 주유소 (0) | 2021.11.02 |
Baekjoon1931*: 회의실 배정, 시간 초과와 그리디 알고리즘 (0) | 2021.11.01 |
Baekjoon11399: ATM (0) | 2021.11.01 |
Baekjoon11047: 동전 0 (0) | 2021.10.31 |