일단 이 문제는… 입력을 받는 것부터가 문제임 이제 그 뭐더라 무슨 AC였나? 그 문제처럼 스트링이 길게 주어지는 건 아니라서 사실 엄청 처리를 까다롭게 할 필요는 없는데 그래도 이참에 파싱하는 거 배워두면 쓸 데 많으니까 이걸로 한 번 연습해봐야겠다고 생각함…

그래서 파싱해서 연산자랑 숫자 따로 입력 받고 + 숫자 int로 변환하고 + 가장 큰 숫자 리턴하는 로직 떠올려서 그것만 구하면 될 거 같은데… 마지막이 좀 문제임ㅋ

근데 로직 또 멍때리고 쳐다보니까 생각난 거 같음… 여기는 연산자가 +랑 -밖에 없잖슴? 그러니까 - 뒤에 오는 숫자가 무조건 커져야 된담 말임.. 왜냐면 식을 최대로 작게 만들어야 되니까

그러니까 쭉 검사하다가 만약 -가 들어오면? 거기 앞에 괄호를 쳤다고 생각을 하고? 쭉쭉 가다가 만약 -가 또 나오거나 식의 끝에 도달했다? 하면 괄호를 닫아주면 됨.

예시를 들자면

1 + 8 - 50 + 6 - 3 - 9

이런 식이 있다고 생각해보자.

위 로직대로 괄호를 치면 이렇게 됨

1 + 8 - (50 + 6) - (3) - (9)

이러면 최소가 되겠지?

그럼 내가 이 문제를 풀기 위해 필요한 지식

  1. 파싱하는 법
  2. 문자열 -> 숫자로 바꾸는 함수… 이거 있는데 얘가 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 못 푼다고 핑계 못 댄다…ㅋㅋㅋㅋㅋ 이 참에 바로 풀어버려야지.