[백준 알고리즘] 1541번: 잃어버린 괄호

1541번: 잃어버린 괄호

문제
세준이는 양수와 +, -, 그리고 괄호를 가지고 길이가 최대 50인 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.

그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.

괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.

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

출력
첫째 줄에 정답을 출력한다.

접근 방법:

괄호를 쳐서 숫자의 최솟값을 만들려면 음수를 최대한 크게 만들어야 한다. 따라서 빼기 연산자를 만났을 때 기 이후 부터 더하기 연산자로 묶여있는 숫자들을 모두 합쳐서 큰 음수로 만든다.

통과 코드:

#include <iostream>
#include <string>
#include <vector>
#include <numeric>

using namespace std;

int accumulate_till_next(string s){
    string n;
    int total = 0;
    for (int i = 0 ; i < s.size() ; i++){
        if(isdigit(s[i])) n.push_back(s[i]);
        else{
            total += stoi(n);
            n.clear();
        }
    }
    total += stoi(n);
    return total;
}

int main (){
    string s;
    cin >> s;

    vector<int> nums;
    string n;
    for (int i = 0 ; i < s.size() ; i++){
        if(isdigit(s[i])) n.push_back(s[i]);
        else{
            if(!n.empty()){
                nums.push_back(stoi(n));
                n.clear();
            }
            if (s[i] == '-'){
                i++;
                while(s[i] != '-' && i != s.size()){
                    n.push_back(s[i++]);
                }
                nums.push_back(accumulate_till_next(n)*-1);
                n.clear();
                i--;
            }
        }
    }
    if (!n.empty()) nums.push_back(stoi(n));
    cout << accumulate(nums.begin(), nums.end(), 0) << endl;

}

Written by@전여훈 (Click Me!)
고민이 담긴 코드를 만들자, 고민하기 위해 공부하자.