[백준] 1541 잃어버린 괄호 C++

11099 단어 baekjoonbaekjoon

문제

코드

#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
using namespace std;

vector<int> v;      // 숫자
vector<char> v2;    // 연산자
int sum = 0;        // 합(최솟값)

void parsing(string str) {
    string tmp = "";
    for(int i=0; i<str.length(); i++) {
        if(str[i]=='+' || str[i]=='-') {
            v.push_back(stoi(tmp));
            v2.push_back(str[i]);
            tmp = "";
        } else { tmp += str[i]; }
    }
    v.push_back(stoi(tmp));
}

void calculator(vector<int> v, vector<char> v2) {
    sum += v[0];
    int j=0;
    for(int i=1; i<v.size(); i++) {

        if(v2[j] == '+') { sum += v[i]; j++; }
        else if(v2[j] == '-') {
            int tmp = v[i++]; j++;
            while(v2[j]=='+') {
                if(i >= v.size() && j >= v2.size()) { break; } 
                tmp+=v[i]; i++; j++;
            }
            i--;
            sum -= tmp;
        }

    }

}

int main() {
    ios::sync_with_stdio(0);

    string str;
    cin >> str;

    parsing(str);
    calculator(v, v2);

    cout << sum << '\n';

    return 0;
}

📌

예전에 풀다가 실패했는데 드디어 풀었다!

간단하게 string으로 식을 받아 parsing함수로 숫자와 연산자를 구분해 벡터에 저장시켜준다. 그리고 calculator함수를 불러 최솟값을 계산해주면 된다.

parsing함수는 연산자를 만나면 tmp에 저장하던 값을 숫자를 저장하는 벡터에 push해주었고 연산자는 만나는 즉시 연산자를 저장하는 벡터에 push 해주었다.
그리고 stoi함수로 (c++는 cstdlib 라이브러리 include 필요) 문자열을 int형으로 바꾸어 저장시켰다.

calculator함수는 먼저 sum에 첫번째 숫자를 저장시킨다. 그리고 for문을 통해 + 연산자를 만나면 sum에 수를 더해주고 - 연산자를 만나면 -연산자를 다시 만날 때까지 tmp에 더하여 최종적으로 sum에 저장시켜준다. 그리고 - 연산자를 만날 때까지 while문으로 도는데 이때 i나 j가 각 벡터의 범위를 벗어나지 않도록 하기 위해 if문을 사용해 벗어났다면 break 시켜준다.

좋은 웹페이지 즐겨찾기