괄호를 쳐서 해당 식의 값을 최솟값으로 만들기 위해선 덧셈끼리 묵어 가장 큰 수를 만든 뒤 빼야 합니다. 가령 100+200-300+400과 같은 식이 있다면 (100+200)-(300+400)으로 식을 고쳐주면 최솟값이 나오죠. 그런데 100+200-300+400-500+600+700-800+900과 같은 식이 있다면 100+200-(300+400)-(500+600+700)-(800+900)으로 식을 고쳐야 최솟값이 나옵니다. 식의 결괏값은 -3900인데, 100+200-(300+400+500+600+700+800+900)과도 결과가 같습니다.
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main(void)
{
string exp; cin >> exp;
int size = exp.length();
int res = 0;
int dv = exp.find('-');
int rep = dv;
while (rep != string::npos) {
exp.replace(rep, 1, "+");
rep = exp.find('-');
}
string s;
string p = exp.substr(0, dv);
istringstream ssp(p);
while (getline(ssp, s, '+')) {
res += stoi(s);
}
if (dv != string::npos) {
string m = exp.substr(dv + 1);
istringstream ssm(m);
while (getline(ssm, s, '+')) {
res -= stoi(s);
}
}
cout << res << endl;
return 0;
}
저는 그래서 처음 '-'가 등장하는 부분을 찾고 첫 '-' 이전 부분은 모두 값을 더해주고 이후의 값은 모두 빼주어 결괏값을 도출했습니다.
'알고리즘 > 백준' 카테고리의 다른 글
[백준/C,C++] 18258번: 큐 2 (0) | 2021.03.15 |
---|---|
[백준/C,C++] 13305번: 주유소 (0) | 2021.03.14 |
[백준/C,C++] 11399번: ATM (0) | 2021.03.13 |
[백준/C,C++] 11047번: 동전 0 (0) | 2021.03.12 |
[백준/C,C++] 12865번: 평범한 배낭 (0) | 2021.03.08 |
댓글