본문 바로가기
알고리즘

백준 s2 1541 잃어버린 괄호 c++

by kyj0032 2024. 1. 25.

 

https://www.acmicpc.net/problem/1541

 

1541번: 잃어버린 괄호

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

www.acmicpc.net

 

풀이

 

처음에는 괄호를 한 번만 칠 수 있는 줄 알고 이걸 어떻게 그리디로 풀지 .. 고민했으나 괄호는 그냥 마음대로 칠 수 있는 거였다.

괄호를 제한없이 칠 수 있으면, -뒤에 오는 숫자들에 괄호를 쳐서 최대한 많이 빼주면 최솟값이 될 거라 예상할 수 있다.

 

-뒤에 오는 +들에 괄호를 치면 -를 분배한 것들과 같다. 다음 -가 오기전까지 +들을 묶어서 빼줄 값이 최대가 되도록 하면 된다.

 

코드

/*boj s2 1541 잃어버린 괄호*/
#include <iostream>
#define MAXN 105
using namespace std;

string S;

int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> S;
    string num = "0";
    int res = 0;
    bool minus = false;
    for (char s : S) {
        if (s == '-') { // 다음 -가 오기 전까지, 뒤에 오는 애들 다 더한만큼 뺌
            if (minus)
                res -= stoi(num);
            else
                res += stoi(num);
            num = "0";
            minus = true;
        } else if (s == '+') {
            if (minus)
                res -= stoi(num);
            else
                res += stoi(num);
            num = "";
        } else { // 숫자
            num += s;
        }
    }
    if (minus) {
        res -= stoi(num);
    } else {
        res += stoi(num);
    }
    cout << res << "\n";
}

'알고리즘' 카테고리의 다른 글

백준 s2 11501 주식 c++  (0) 2024.01.26
백준 g5 2170 선 긋기 c++  (0) 2024.01.26
백준 s4 11399 ATM c++  (0) 2024.01.25
백준 s4 1026 보물 c++  (0) 2024.01.25
백준 s4 2217 로프 c++  (0) 2024.01.25