delpho

[실버 2, 부호 다루기] 백준 1541 - 잃어버린 괄호 (자바) 본문

알고리즘/그리디

[실버 2, 부호 다루기] 백준 1541 - 잃어버린 괄호 (자바)

delpho 2024. 2. 19. 14:26

Think

  1. 괄호를 활용해서 최솟값을 만들 수 있는 방법은, - 값을 최대로 만들도록 해야한다.
    • 예를들어, 20+30-10+50-70 라면, 20+30-(10+50)-(70) 와 같이 만들어주어야 한다.
  2. 그래서 처음 구현 아이디어는, 해당 식에 직접 괄호 문자를 추가한 후, 하나씩 파싱하며 값을 계산했는데 구현이 넘 복잡해지고 틀리기도 했다.
  3. 구글링을 통해 풀이를 살펴보니, StringTokenizer나 String.split()을 통해 - 부호를 기준으로 문자열들을 나눈 후, 각각 문자열을 + 부호로 또 나눠서 더해준 뒤 값을 계산한다.
  4. 나뉜 문자열의 처음 값은 + 값이기 때문에 이 값을 처리해야하는데, sum 변수를 Integer.MAX_VALUE로 초기화 후 if문을 통해 저장한다.
    • sum = 0으로 하면, 값을 빼주는 과정에서 sum값이 또 0이 될 수 있기에 문제가 있음

 

제출 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

//https://st-lab.tistory.com/148
public class test {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer st;

    public static void main(String[] args) throws IOException {
        init();

        process();
    }

    private static void process() {
        int sum = Integer.MAX_VALUE;

        while(st.hasMoreTokens()){
            int temp = 0;

            StringTokenizer st2 = new StringTokenizer(st.nextToken(), "+");

            while(st2.hasMoreTokens()){
                temp += Integer.parseInt(st2.nextToken());
            }

            if(sum == Integer.MAX_VALUE){
                sum = temp;
            }else{
                sum -= temp;
            }
        }
        System.out.println(sum);
    }

    public static void init() throws IOException {
        st = new StringTokenizer(br.readLine(), "-");
    }
}