mojo's Blog

[백준 2504] 괄호의 값 본문

백준/Stack, Queue

[백준 2504] 괄호의 값

_mojo_ 2021. 7. 1. 21:27

문제 링크 => 2504번: 괄호의 값 (acmicpc.net)

 

2504번: 괄호의 값

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

www.acmicpc.net


Stack을 활용한 문제이다.

 

스택 관련 문제중에 좀 어려운 문제여서 잘 안풀렸던 문제인거 같다.

 

이 문제를 해결하기 위해 최종값을 나타내기 위한 변수 result와 접근해가면서 괄호 안의 값들을 더하는 operation을 처리하기 위한 변수 tmp를 선언하였다.

 

그리고 '(', '[' 문자일때와 ')', ']' 문자일때의 operation을 다음과 같이 처리해주었다.

 

(1) '(', '[' 문자를 발견할 경우 => 스택에 문자를 push하고 tmp 값에 2 또는 3값을 곱해준다.

 

(2) ')', ']' 문자를 발견한 경우 => 이때 입력이 옳바르지 않은 경우에 대해 먼저 처리해주도록 한다.

 

예를 들어서 ']' 문자가 올때 '(', '[' 문자를 담은 스택이 비거나 또는 비어있지 않은 경우에 대해서 스택의 top에 '[' 문자가 아닌 다른 문자가 있는 경우에 대해서 0을 출력하고 return 하도록 하였다.

 

그 외의 경우에는 옳바른 경우이므로 괄호의 값 tmp 에 대해 한번에 result에 더해주는데 이때, 그 이전 문자가 '[' 이거나 '(' 인 경우를 판별하여 더해주는것이 핵심이다.

 

결과를 출력할 때 스택이 빈 경우에 출력이 가능하며 비어있지 않은 경우 0을 출력하도록 한다.

(비어있지 않은 경우는 [ [ [ [ ] 와 같은 경우라고 볼 수 있겠다)

 

풀이 code

#define _CRT_SECURE_NO_WARNINGS
#include <string>
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <time.h>
#define INF 100000000
#define endl '\n'

using namespace std;

void solve(string str) {
	stack<char> s;
	int result = 0, tmp = 1;
	for (int i = 0; i < str.size(); i++) {
		if (str[i] == '(') {
			s.push(str[i]);
			tmp *= 2;
		}
		else if (str[i] == '[') {
			s.push(str[i]);
			tmp *= 3;
		}
		else if (str[i] == ']') {
			if (s.empty() || s.top() != '[') {
				cout << 0 << endl;
				return;
			}
			if (str[i - 1] == '[') {
				result += tmp;
			}
			tmp /= 3;
			s.pop();
		}
		else if (str[i] == ')') {
			if (s.empty() || s.top() != '(') {
				cout << 0 << endl;
				return;
			}
			if (str[i - 1] == '(') {
				result += tmp;
			}
			tmp /= 2;
			s.pop();
		}
	}
	if (s.empty()) cout << result << endl;
	else cout << 0 << endl;
	return;
}

int main() {
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);

	string str;
	cin >> str;
	solve(str);
	
	return 0;
}

 

'백준 > Stack, Queue' 카테고리의 다른 글

[백준 1655] 가운데를 말해요  (0) 2021.08.05
[백준 11003] 최솟값 찾기  (0) 2021.07.10
[백준 5397] 키로거  (0) 2021.07.01
Comments