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

Boknami·2023년 9월 23일
0

백준문제풀이

목록 보기
37/45

📌 첫 접근 및 실패

이번 주가 그리디를 푸는 주차였기 때문에 그리디에 집착하면서 푼 게 독이 된 것 같다..
그리고 주어지는 길이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. 괄호는 1개가 아니다.

바보 같이 괄호가 1개라는 말은 어디에도 없다..또 멋대로 생각하고 문제를 ...아아

2. 비효율적 접근

나는 정말 비효율적으로 문제를 접근했다라는 생각이 들었다..
최솟값을 구한다는 것은 가장 큰 수를 빼는 것임을 생각하지 못하고 문제를 무작정 그리디적인 사고방식이랍시고 풀려고 했다..

10+20-30-40+50-90 이런 식으로 있을 때
최소값을 만들 게 하려면 40+50을 먼저 계산하고 나서 빼는 것이 가장 최솟값을 만들 수 있을 것이다. 이처럼 가장 큰 수를 빼기 위해서는 덧셈 인자들은 전부 계산한 다음(괄호로)에 -를 하면 된다..

정리하면
1. -를 기준으로 값들을 split한다(우린 어짜피 +들은 괄호로 계산할 것이니 -만 남겨두는)
2. +값들은 괄호로 모두 묶어준다
3. 묶은 값을 -로 빼나간다

0개의 댓글