GitHubSeob

C++ / 백준 / 2504 / 괄호의 값 본문

Baekjoon/Silver

C++ / 백준 / 2504 / 괄호의 값

GitHubSeob 2022. 3. 14.

문제

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

 

2504번: 괄호의 값

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

www.acmicpc.net

문제풀이

먼저 입력이 올바르진 못한 괄호 열을 판별하기 위해 for문으로 판별을 한다.

그다음 while문으로 []을 2로 치환, ()을 3으로 치환한다.

그다음 while문으로 피연산자, 피연산자, 연산자 형태로 나열되어있는 idx를 찾고 연산을 한 후 idx에 연산 값을 저장, erase로 idx+1, idx+2를 지운다.

모든 연산이 끝나 더 이상 연산을 할 수 없는 경우는 피연산자 하나만 남아있는 경우이므로 while문을 종료하고 해당 값을 출력한다.

 

코드

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

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	string input("");
	cin >> input;
	stack<char>bracket;
	vector<string>s;
	int idx(0);

	for (idx = 0; idx < input.size(); ++idx) {
		if (input[idx] == ')' || input[idx] == ']') {
			if (bracket.empty()) {
				cout << 0;
				return 0;
			}
			else if (input[idx] == ')') {
				if (bracket.top() == '(') {
					bracket.pop();
				}
				else {
					cout << 0;
					return 0;
				}
			}
			else {
				if (bracket.top() == '[') {
					bracket.pop();
				}
				else {
					cout << 0;
					return 0;
				}
			}
		}
		else {
			bracket.push(input[idx]);
		}
	}
	if (!bracket.empty()) {
		cout << 0;
		return 0;
	}

	int round(0), square(0);

	while (1) {
		round = input.find("()");
		square = input.find("[]");
		if (round == -1 && square == -1) {
			s = vector<string>(input.size() + 2, "");
			for (idx = 0; idx < input.size(); ++idx) {
				s[idx] = input[idx];
			}
			break;
		}
		if (round != -1)
			input.replace(round, 2, "2");
		else if (square != -1)
			input.replace(square, 2, "3");
	}

	while (s.size() > 3) {
		for (idx = 0; idx + 2 < s.size(); ++idx) {
			if (s[idx] == "(" && s[idx + 1] != "(" && s[idx + 2] == ")") {
				s[idx] = to_string(stoi(s[idx + 1]) * 2);
				s.erase(s.begin() + idx + 1);
				s.erase(s.begin() + idx + 1);
				break;
			}
			else if (s[idx] == "[" && s[idx + 1] != "[" && s[idx + 2] == "]") {
				s[idx] = to_string(stoi(s[idx + 1]) * 3);
				s.erase(s.begin() + idx + 1);
				s.erase(s.begin() + idx + 1);
				break;
			}
			else if (s[idx] != "[" && s[idx] != "(" && s[idx + 1] != "[" && s[idx + 1] != "(") {
				s[idx] = to_string(stoi(s[idx]) + stoi(s[idx + 1]));
				s.erase(s.begin() + idx + 1);
				break;
			}
		}
	}
	cout << s[0];
}