Little Jay

[C++] 백준 1541번 - 잃어버린 괄호 본문

알고리즘/BOJ

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

Jay, Lee 2022. 7. 4. 16:40

좀 비효율적인 코드이긴한데 전체적인 로직에서 크게 다를점이 없다.

결과적으로 '-'가 언제 들어오는지가 관건이 된다.

 

https://www.acmicpc.net/board/view/86898

 

여기에 반례가 정리되어 있는데 이 반례를 보면 결국 '-'가 한번 들어오고 '+'가 들어와도 괄호를 끝까지 쳐버리면 되고, '-'가 연속적으로 들어오게 된다면 그냥 괄호를 치지 않고 계속해서 빼기만 해주면 된다. 이 점만 좀 유의하면 한 번에 correct이 뜰 수 있었을텐데 아쉽다.

코드는 좀 지저분하고 비효율적이라 로직만 참고하시길 바란다. 

#include <bits/stdc++.h>
#define endl '\n'
using namespace std;

string s, num;
int temp;

int main() {

	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	cin >> s;
	int len = s.size();
	int start = 0;
	bool flag = false;
	int ans = 0;

	for (int i = 0; i < len; i++) {
		if (s[i] == '-' || s[i] == '+') {
			if (s[i] == '-') flag = !flag;
			num = s.substr(start, i);
			start = i + 1;
			temp = stoi(num);
			ans += temp;
			break;
		}
	}

	for (int i = start; i < len; i++) {
		if (s[i] == '-' || s[i] == '+') {
			num = s.substr(start, i);
			start = i + 1;
			temp = stoi(num);
			if (flag) ans -= temp;
			else ans += temp;
			if (s[i] == '-') {
				if (!flag) flag = !flag;
			}
		}
	}

	num = s.substr(start, len);
	temp = stoi(num);
	if (flag) ans -= temp;
	else ans += temp;

	cout << ans << endl;

	return 0;

}
Comments