일단 이 문제는… 입력을 받는 것부터가 문제임 이제 그 뭐더라 무슨 AC였나? 그 문제처럼 스트링이 길게 주어지는 건 아니라서 사실 엄청 처리를 까다롭게 할 필요는 없는데 그래도 이참에 파싱하는 거 배워두면 쓸 데 많으니까 이걸로 한 번 연습해봐야겠다고 생각함…
그래서 파싱해서 연산자랑 숫자 따로 입력 받고 + 숫자 int로 변환하고 + 가장 큰 숫자 리턴하는 로직 떠올려서 그것만 구하면 될 거 같은데… 마지막이 좀 문제임ㅋ
근데 로직 또 멍때리고 쳐다보니까 생각난 거 같음… 여기는 연산자가 +랑 -밖에 없잖슴? 그러니까 - 뒤에 오는 숫자가 무조건 커져야 된담 말임.. 왜냐면 식을 최대로 작게 만들어야 되니까
그러니까 쭉 검사하다가 만약 -가 들어오면? 거기 앞에 괄호를 쳤다고 생각을 하고? 쭉쭉 가다가 만약 -가 또 나오거나 식의 끝에 도달했다? 하면 괄호를 닫아주면 됨.
예시를 들자면
1 + 8 - 50 + 6 - 3 - 9
이런 식이 있다고 생각해보자.
위 로직대로 괄호를 치면 이렇게 됨
1 + 8 - (50 + 6) - (3) - (9)
이러면 최소가 되겠지?
그럼 내가 이 문제를 풀기 위해 필요한 지식
- 파싱하는 법
- 문자열 -> 숫자로 바꾸는 함수… 이거 있는데 얘가 00009 같은 문자열도 9로 변환해주는지 확인해봐야 될 듯
그럼 이제 코드를 짜보겠습니다
먼저 파싱 관련해서는 이 글들의 도움을 받았다. find_first_of 레퍼런스 이 함수를 쓰면 여러 문자를 기준으로 파싱하는 것이 가능하다. 파싱 관련 블로그 포스트 이 블로그에서 find, erase, substr 함수를 이용해서 파싱하는 코드를 참고했다.
문자열에서 int 이슈는 stoi 써보니까 문제 없이 변환되는 걸 확인함.
그리고 마지막으로 로직… 생각해보니까 그냥 -가 한 번 들어오면 그 때부터는 모든 수를 무조건 빼는 방법으로 가면 되는 거였음. 왜냐하면 - 뒤에 적당히 괄호를 붙여주면 +는 무조건 다 -가 되니까~
결론적으로 작성한 코드는 여기
#include <iostream>
#include <vector>
#include <string>
using namespace std;
vector<string> tokenizer (string& str) {
vector<string> arr;
str.insert(str.length(), "+");
int pos = 0;
while ((pos = str.find_first_of("+-")) != string::npos) {
arr.push_back(str.substr(0, pos));
arr.push_back(string(1, str[pos]));
str.erase(0, pos + 1);
}
return arr;
}
int main() {
string str;
int answer = 0;
bool add = true;
cin >> str;
vector<string> arr = tokenizer(str);
for (auto s : arr) {
if (s == "-") {
add = false;
continue;
} else if (s == "+") {
continue;
}
else {
int t = stoi(s);
if (add) answer += t;
else answer -= t;
}
}
cout << answer;
}
이제 파싱하는 법 배웠으니 AC 못 푼다고 핑계 못 댄다…ㅋㅋㅋㅋㅋ 이 참에 바로 풀어버려야지.