본문 바로가기
알고리즘, 자료구조/알고리즘

1541 잃어버린 괄호

by Wordbe 2019. 7. 25.
728x90

그리디 알고리즘으로 푸는 문제이다.

괄호를 무한히 맘대로 사용할 수 있다.

-가 나온 뒤에

+가 나온다면 다 괄호로 묶고,

-가 나온다면 새로 괄호를 시작하여 뒤에 +를 다 묶으면 된다.

즉 -가 나오면 그냥 다 빼주면 된다.

그 순간의 최적해가 전체의 최적해가 되는 구조인 문제.

논리적으로 이게 정답이 나올지 잘 생각해보아야 한다.

그게 보장이 된다면,

greedy algorithm으로 해를 구할 수 있다.

+는 상관없이 계속 더하면 되지만, -가 나오면 그 다음으로 나오는 수는 다 빼주면 된다.

#include <iostream>
using namespace std;

int main() {
    string s;
    getline(cin, s);
    bool minus_check = false;
    int start = 0;
    int ans = 0;
    for (int i=0; i<s.size(); ++i){
        if (s[i] == '+') {
            ans += stoi(s.substr(start, i - start));
            start = i + 1;
            continue;
        }
        if (s[i] == '-'){
            ans += stoi(s.substr(start, i - start));
            start = i + 1;
            minus_check = true;
            break;
        }
    }
    if (minus_check){
        for (int i=start; i<s.size(); ++i){
            if (s[i] == '+' || s[i] == '-'){
                ans -= stoi(s.substr(start, i - start));
                start = i + 1;
                continue;
            }
        }
        ans -= stoi(s.substr(start, s.size() - start));
    }
    else ans += stoi(s.substr(start, s.size() - start));
    cout << ans << '\n';
    return 0;
}
728x90

'알고리즘, 자료구조 > 알고리즘' 카테고리의 다른 글

[1931] 회의실배정  (0) 2019.07.29
2217 로프  (0) 2019.07.25
1107 리모컨  (0) 2019.07.21
1018 체스판 다시 칠하기  (0) 2019.07.18
[brute-force] 1436 영화감독 숌  (0) 2019.07.16

댓글