알고리즘/문자열

[백준알고리즘] 문자열/그리디 - 1541번 잃어버린 괄호 문제

Fenderblue 2023. 5. 16. 21:15

https://www.acmicpc.net/problem/1541

 

1541번: 잃어버린 괄호

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다

www.acmicpc.net

요새 문자열 문제를 안풀어본것 같아서 함 풀어봤다.

-연산자가 나온다면 앞에 있는수는 작게, 뒤에 오는수는 크게 만들어서 풀면 되겠다고 생각했으나

문자열을 어떻게 처리해서 연산시켜야 할지 막막했다..

 

해결방법

관건은 -연산이다. + 연산자들을 묶어서 먼저 합쳐준 뒤 마지막에 그것들을 갖고 -연산을 하면 된다

문자열을 먼저 - 을 구분자로 split함수를 통해 나눠서 배열에 저장하고 (그러면 "1+2", "3", "3+1+5"이런식으로 나눠질것이다)

그렇게 나눠진 것들을 +구분자로 다시 split으로 쪼개어 피연산자들만 배열에 넣어준뒤 합쳐준다

(이때 구분자를 "+"로 하면 원하는대로 인식을 못한다..이스케이프 문자를 써서 "\\+"로 표현해줘야한다..불편하다..)

그렇게 +연산을 해서 하나로 나온 sum값을 순서대로 빼주면 된다

이때 제일 먼저 들어오는 값은 맨 앞에있는 값이라 -연산할게 없으므로 그냥 result에 넣어주면 된다

 

막상 코드는 간단한데 풀이과정이 나에겐 쉽지 않았던 문제이다..

그리디 알고리즘으로 분류되어 있던데 이게 왜 그리디한건지 사실 잘 와닿진 않았다

package baekjoonWeek6;

import java.io.*;

public class BJ_1541 {
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();
        String[] splitByMinus = str.split("-");
        int result = Integer.MAX_VALUE; //첨엔 -1이라고 해놨었다가 틀렸었
        for (int i = 0; i < splitByMinus.length; i++) {
            String[] splitByPlus = splitByMinus[i].split("\\+");
            int sum = 0;
            for (int j = 0; j < splitByPlus.length; j++) {
                sum += Integer.parseInt(splitByPlus[j]);
            }
            if (result == Integer.MAX_VALUE) { //맨 첫번째 값이면 빼지말고 그냥 넣어준다
                result = sum;
            } else {
                result -= sum;
            }
        }
        bw.write(Integer.toString(result));
        bw.flush();
        bw.close();
    }
}