이번 주가 그리디를 푸는 주차였기 때문에 그리디에 집착하면서 푼 게 독이 된 것 같다..
그리고 주어지는 길이max가 50, 한 숫자가 5자리까지 길어질 수 있었기에 크게 시간제한은 안 걸릴 것 같았다.
괄호를 친다는 것은 우선적으로 계산한다는 의미이고 그렇기에 한 부호씩 이동하면서 계산하고 한 번 계산할 때마다 최소값을 갱신하려고 했다..그런데 코드가 점점 길어지고 효율성도 이상해졌고 무엇보다 정해둔 시간이 오버되어 답을 참고하기로 했다!
#틀린 코드
import java.io.*;
import java.util.*;
public class Main {
/* 아이디어 생각
for(int i = 0 ; i < numbers.length; i++){
System.out.println(numbers[i]);
}
for(int i = 0 ; i < signs.length; i++){
System.out.println("signs = " + signs[i]);
}
괄호를 적절히 쳐서 !최소!
괄호 -> 우선적으로 계산한다.
그럼 해당 식에서 괄호를 한 곳씩 두면서 최소값을 찾자!
길이의 최대 -> 50
1.입력에 대한 처리
값을 받아서 기호랑 분리한다? -> spilt
그대로 값을 받아서 처리한다?
*/
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
String temp = st.nextToken();
String[] numbers = temp.split("\\+|-");
String[] signs = temp.split("[0-9 ]+");
int min = Integer.parseInt(numbers[0]);
for(int i = 1 ; i < signs.length; i++){
if(signs[i].equals("+")){
min = min + Integer.parseInt(numbers[i]);
}
else if (signs[i].equals("-")) {
min = min - Integer.parseInt(numbers[i]);
}
}
System.out.println(min);
for(int i = 1 ; i < signs.length; i++){//괄호의 위치를 옮기는 역할
//괄호에 위치에 따른 계산을 하고 나머지 계산을 쭉 하자!
int tmp = 0;
if(signs[i].equals("+")){
tmp = Integer.parseInt(numbers[i]) + Integer.parseInt(numbers[i+1]);
}
else if (signs[i].equals("-")) {
tmp = Integer.parseInt(numbers[i]) - Integer.parseInt(numbers[i+1]);
}
int front = Integer.parseInt(numbers[0]);
//괄호 계산한 거 빼고! 앞에서부터~
for(int j = 0 ; j < i-1; j++){
if(signs[i].equals("+")){
front += Integer.parseInt(numbers[i]);
}
else if (signs[i].equals("-")) {
front -= Integer.parseInt(numbers[i]);
}
}
if(signs[i-1].equals("+")){
tmp += front;
}
else if (signs[i-1].equals("-")) {
tmp -= front;
}
int end = Integer.parseInt(numbers[]);
for(int k = i+1 ; k < signs.length; k++){
if(signs[k].equals("+")){
front += Integer.parseInt(numbers[i]);
}
else if (signs[k].equals("-")) {
front -= Integer.parseInt(numbers[i]);
}
}
//괄호 계산한 거 빼고! 앞에서부터~
min = Math.min(min,tmp);
}
//System.out.println(Integer.parseInt(numbers[0]) - Integer.parseInt(numbers[1]));
}
}
바보 같이 괄호가 1개라는 말은 어디에도 없다..또 멋대로 생각하고 문제를 ...아아
나는 정말 비효율적으로 문제를 접근했다라는 생각이 들었다..
최솟값을 구한다는 것은 가장 큰 수를 빼는 것임을 생각하지 못하고 문제를 무작정 그리디적인 사고방식이랍시고 풀려고 했다..
10+20-30-40+50-90 이런 식으로 있을 때
최소값을 만들 게 하려면 40+50을 먼저 계산하고 나서 빼는 것이 가장 최솟값을 만들 수 있을 것이다. 이처럼 가장 큰 수를 빼기 위해서는 덧셈 인자들은 전부 계산한 다음(괄호로)에 -를 하면 된다..
정리하면
1. -를 기준으로 값들을 split한다(우린 어짜피 +들은 괄호로 계산할 것이니 -만 남겨두는)
2. +값들은 괄호로 모두 묶어준다
3. 묶은 값을 -로 빼나간다