반응형
https://www.acmicpc.net/problem/2504
스택 구조를 이용해서 풀었습니다.
닫는 괄호가 나올 때마다 스택에 담겨있는 숫자 값을 이용해서 새롭게 연산해서 푸시해줍니다.
괄호의 아스키코드와 구분하기 위해, 숫자 값은 음수로 담아주었습니다.
#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 |