https://www.acmicpc.net/problem/1541
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다.
첫째 줄에 정답을 출력한다.
그리디 문제의 정석 최솟값을 만들기 위해서는 가능한 큰 수를 빼야한다.
그러므로 더하기 연산들만 먼저 모아서 모두 더하고 그 후 빼면 문제가 해결된다.
vector<string> split(string input, char delimiter)
{
vector<string>result;
stringstream mystream(input);
string splitdata;
while (getline(mystream, splitdata, delimiter))
{
result.push_back(splitdata);
}
return result;
}
문자를 기준으로 vector 컨테이너에 수를 저장하는 split 함수
파이썬 등에는 내장함수로 존재하지만 c++에서는 지원하지 않아
코테를 보려면 외워야한다.
string example
vector<string>temp = split(example, '+');
첫번째 매개변수는 넣을 문자열 두번째 매개변수는 파티션할 기준문자이다.
int mySum(string a)
{
int sum = 0;
vector<string>temp = split(a, '+');
for (int i = 0; i < temp.size(); i++)
{
sum += stoi(temp[i]);
}
return sum;
}
두번째함수 -기준으로 먼저 가르고 나온 문자들을 모두 stoi로 합하여 저장해주는 간단한 함수이다.
이 안에서 다시 한 번 split을 호출하여 -기준으로 가르고 나온 +수들을 다시 갈라 stoi로 정수로 변환하여 다 합하여준다.
for (int i = 0; i < str.size(); i++)
{
int temp = mySum(str[i]);
if (i == 0)
{
answer += temp;
}
else {
answer -= temp;
}
}
main에서는 간단하게 mysum으로 나온 합들을 전체답 변수에서 빼준다.
i가 0일때 더하는 이유는 앞에 수가 없으면 무조건 양수이기 때문에 먼저 더하고 시작하여준다.
느낀점 split 함수를 c++에서는 외워야겠구나.
void solve(void)
{
for (int i = 0; i <= s.size(); ++i){
if (s[i] == '+' || s[i] == '-' || s[i] == '\0'){
if (m) {
num -= stoi(tmp);
}
else {
num += stoi(tmp);
}
if (s[i] == '-') {
m = 1;
}
tmp = "";
continue;
}
tmp += s[i];
}
}
이렇게 더 간단하게도 할 수 있다.