GitHubSeob
C++ / 백준 / 2504 / 괄호의 값 본문
문제
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];
}
'Baekjoon > Silver' 카테고리의 다른 글
C++ / 백준 / 14425 / 문자열 집합 (0) | 2022.03.21 |
---|---|
C++ / 백준 / 1620 / 나는야 포켓몬 마스터 이다솜 (0) | 2022.03.21 |
C++ / 백준 / 2346 / 풍선 터뜨리기 (0) | 2022.03.14 |
C++ / 백준 / 1874 / 스택 수열 (0) | 2022.03.14 |
C++ / 백준 / 10799 / 쇠막대기 (0) | 2022.03.13 |