PS
[C++] 백준 2504 : 괄호의 값
왕방토
2023. 3. 5. 18:15
728x90
https://www.acmicpc.net/problem/2504
2504번: 괄호의 값
4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다. 만일 X
www.acmicpc.net
사람 기 죽이는 실버
ㅋㅋㅋ
보자마자 스택 써야겠다는 걸 알겠어도 푸는게 쉽지가 않음
어려웠던 가장 큰 이유는
base인 tmp를 자꾸 가장 안의 괄호로 생각해서 그런 것 같다
스택이 아래서부터 쌓이는데 자꾸 중간을 생각해서..
구글링 해봤는데 분배법칙처럼 생각하면 좋다고 하던데 그 말이 맞는 거 같다 아니 어떻게 생각하지? ㅋㅋ
스택이니까 왼쪽(아래쪽) 부터차례로 해야겠다 뭐 그런 식으로 생각하면 되는 건가
그러려고 노력해 봐야겠다
아래 주석의 //처음부터 닫힘 안 들어온다는 부분은
i-1 범위체크 안 해준 거 말하는 거임
#include <iostream>
#include <stack>
#include <cstring>
using namespace std;
int main() {
char str[31];
scanf("%s", str);
int str_len = strlen(str);
stack<char> s;
bool not_okay = false;
int ans = 0;
int tmp = 1;
for(int i = 0; i<str_len; i++){
if (str[i] == '(') {
s.push('(');
tmp *= 2;
}
else if (str[i] == '[') {
s.push('[');
tmp *= 3;
}
else if (str[i] == ')') {
if (s.empty()) {
not_okay = true;
break;
}
if (s.top() == '(') {
s.pop();
//처음부터 닫힘안들어오니까
if (str[i - 1] != ')' && str[i - 1] != ']') {
ans += tmp;
}
tmp /= 2;
}
else {
not_okay = true;
break;
}
}
else if (str[i] == ']') {
if (s.empty()) {
not_okay = true;
break;
}
if (s.top() == '[') {
s.pop();
if (str[i - 1] != ')' && str[i - 1] != ']') {
ans += tmp;
}
tmp /= 3;
}
else {
not_okay = true;
break;
}
}
}
if (not_okay || !s.empty()) printf("0");
else printf("%d", ans);
}