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

Ga0·2024년 5월 13일
0

baekjoon

목록 보기
126/137
post-custom-banner

문제 해석

  • 말그대로 더하기(+)와 빼기(-)로 이루어진 식을 입력받아 괄호를 추가하여 최솟값이 나오도록 하는 문제이다.
  • 몇가지만 알고가면되는데 최솟값이 나오도록 하려면 작은수-큰수를 빼면 된다.
  • 하지만, 여기서의 식을 쪼개 순서를 바꿀 수는 없으니 빼기(-)를 기준으로 나눠 일단 큰수로 만든 다음에 빼면 된다.
  • 다시말해 식을 빼기(-)로 나누어 일단 더하기(+)를 모두 진행한 후 그 다음에 빼자는 것이다.
  • 예를 들어 아래와 같은 식이 있다고 치자
20-90-10+40-10+120+5-45+20
가 있다고 치자
존재하는 순서대로 쭉 계산하면 50이 된다.

만약 -를 기준으로 나눈다면?
20       90     (10+40)        (10+120+5)          (45+20)

20 	 -	 90   -    50      -       135      -        65

= -320 이 나온다.

아마 이보다 더 작은 수가 나오진 않을 것이다...
  • 예시처럼 더하기를 먼저 수행 후 빼기를 진행한다면 최솟값을 구할 수 있다.
  • 부족한 설명은 코드 주석으로 적어놓았다:)

코드

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String problem = br.readLine();

        br.close();

        // 1.  결과 값이 최솟 값이 나오기 위해선 큰 값으로 빼야 한다.
        // 1-1. 큰 값을 만들기 위해 더하기를 진행한다.
        // 1-2. 일단, 빼기는 나중에 하므로 빼기를 기준으로 나눠서 더하기 붙어있는 기준으로 더한다.
        String[] splitMinusProblem = problem.split("-");

        int result = Integer.MAX_VALUE; //최종 값을 저장하는 변수

        // 2. 빼기(-)를 기준으로 식을 분리했으니 분리된 상태에서 각각 더하기를 진행한다.
        for(int i = 0; i < splitMinusProblem.length; i++){
            int sum = 0;

            // 2-1. 더하기 위해 숫자를 더하기(+)를 기준으로 분리한다.
            String[] splitPlusProblem = splitMinusProblem[i].split("\\+"); // +는 특정 의미를 가지고 있어 백슬래시(\\)해야 작동함

            // 2-2. 빼기로 분리한 식별 더하기를 수행한다.
            for(int j = 0; j < splitPlusProblem.length; j++){
                sum += Integer.parseInt(splitPlusProblem[j]); //더하기 누적
            }

            // 2-3. 모두 더했다면 최종 값에 누적으로 빼줘야한다.
            if(result == Integer.MAX_VALUE){ //처음 값이면 빼는 게 아니라 그대로의 값이 들어감
                result = sum;
            }else{ //처음 값이 아닌 경우 누적으로 빼준다.
                result -= sum;
            }

        }

        // 3. 결과 출력
        System.out.println(result);

    }
}

결과

느낀 점

문제 자체는 크게 어려움이 없는 문제였기 때문에 금방 풀 수는 있었지만 누적해서 최종 값에 넣을 때 처음 값을 어떻게 해야할지 감이 안와서 다른 분의 코드를 참고했다. (Integer.MAX_VALUE로 구분할지는 전혀 생각해내지 못했다. 물론 다른 방법도 있겠지만 이 방법을 발견해서 사용했다)

post-custom-banner

0개의 댓글