블로그

[C++] 백준 2504 : 괄호의 값 본문

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);
}

'PS' 카테고리의 다른 글

백준 배낭 모음..  (0) 2023.03.05
[C++] 백준 2407 : 조합  (0) 2023.03.05
[C++] 백준 4256 : 트리  (0) 2023.03.05
[C++] 백준 2263 : 트리의 순회  (0) 2023.03.05
[C++] 백준 1780 : 종이의 개수  (0) 2023.03.05
Comments