반응형

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

 

2504번: 괄호의 값

4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다.  만일

www.acmicpc.net

 

스택 구조를 이용해서 풀었습니다.

닫는 괄호가 나올 때마다 스택에 담겨있는 숫자 값을 이용해서 새롭게 연산해서 푸시해줍니다.

괄호의 아스키코드와 구분하기 위해, 숫자 값은 음수로 담아주었습니다.

#include <iostream>
#include <stack>
using namespace std;

stack<int> stk;
char buf[31];

bool isValidate() {
	for (int i = 0; buf[i] != '\0'; i++) {
		if (buf[i] == '(' || buf[i] == '[') stk.push(buf[i]);
		else {
			if (stk.empty()) return false;
			if (buf[i] == ')') {
				if (stk.top() != '(') return false;
			}
			else {
				if (stk.top() != '[') return false;
			}
			stk.pop();
		}
	}
	if (stk.empty()) return true;
	else return false;
}

int main() {
	scanf("%s", buf);
	if (!isValidate()) {
		printf("0");
		return 0;
	}
	for (int i = 0; buf[i] != '\0'; i++) {
		if(buf[i] == '(' || buf[i] == '[') stk.push(buf[i]);
		else {
			if (buf[i] == ')') {
				if (stk.top() < 0) {
					int sum = 0;
					while (!stk.empty() && stk.top() != '(') {
						if(stk.top() < 0) sum += stk.top();
						stk.pop();
					}
					if (!stk.empty() && stk.top() == '(') stk.pop();
					stk.push(2 * sum);
				}
				else {
					stk.pop();
					stk.push(-2);
				}
			}
			else if (buf[i] == ']'){
				if (stk.top() < 0) {
					int sum = 0;
					while (!stk.empty() && stk.top() != '[') {
						if (stk.top() < 0) sum += stk.top();
						stk.pop();
					}
					if (!stk.empty() && stk.top() == '[') stk.pop();
					stk.push(3 * sum);
				}
				else {
					stk.pop();
					stk.push(-3);
				}
			}
		}
	}
	int ans = 0;
	while (!stk.empty()) {
		if(stk.top() < 0) ans += stk.top();
		stk.pop();
	}
	printf("%d", -ans);
}
반응형

'Algorithm' 카테고리의 다른 글

백준 18258 : 큐 2  (0) 2021.11.15
백준 2493 : 탑  (0) 2021.11.14
백준 5430 : AC  (0) 2021.11.14
백준 1406 : 에디터  (0) 2021.11.14
백준 11866 : 요세푸스 문제 0  (0) 2021.11.14

+ Recent posts