May 05, 2020
문제
세준이는 양수와 +, -, 그리고 괄호를 가지고 길이가 최대 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;
}