본문 바로가기
알고리즘/백준

[백준/C,C++] 1541번: 잃어버린 괄호

by 이민훈 2021. 3. 14.

www.acmicpc.net/problem/1541

 

1541번: 잃어버린 괄호

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다

www.acmicpc.net

괄호를 쳐서 해당 식의 값을 최솟값으로 만들기 위해선 덧셈끼리 묵어 가장 큰 수를 만든 뒤 빼야 합니다. 가령 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

댓글