

풀이과정
1. 입력받은 문자가 '('나 '['면 스택에 push 한다. 결과값은 벡터에 저장한다.
(벡터의0번째 = 최종 결과값, 그 외 = 곱셈연산 내부 결과값 저장)
2. ')'일 때, 스택의 top이 '['가 아닌 경우 아래를 수행한다.
- 이전에 입력한 문자가 '('라면 "()"로 2의 값을 갖고, 스택에서 pop 한 후 결과(iResult)값에 2를 더한다.
- 이전에 입력한 문자가 '('가 아니라면 '(X)'로 2*X값을 수행한다.
* 스택의 사이즈가 0이라면 vector의 0번째에 2를 더한다.
* 스택의 사이즈가 1이라면 곱셈 연산이 있으므로 벡터의 스택 사이즈 번째(v.at( st.size() ) )에 2를 곱한 후
v.at( st.size()-1 )에 저장한다.
위의 과정을 반복한 후 스택의 사이즈가 0이 아니라면 올바르지 못한 괄호열로 0을 출력하고, 0이라면 벡터의 0번째에 저장된 덧셈&곱셈의 최종 결과를 출력한다.
코드
더보기
#include <iostream>
#include <stack>
#include <vector>
#include <string>
using namespace std;
int main()
{
int iResult = 0;
string s;
stack<char> st;
vector<int> v;
v.resize(30);
cin >> s;
for (int i = 0; i < s.length(); ++i)
{
if (s[i] == '(' || s[i] == '[') st.push(s[i]);
else
{
if (st.empty())
{
st.push(s[i]);
break;
}
else
{
if (s[i] == ')')
{
if (st.top() != '[')
{
st.pop();
if (s[i - 1] == '(') v.at(st.size()) += 2;
else
{
v.at(st.size()+1) *= 2;
v.at(st.size()) += v.at(st.size() + 1);
v.at(st.size() + 1) = 0;
}
}
}
else if (s[i] == ']')
{
if (st.top() != '(')
{
st.pop();
if (s[i - 1] == '[') v.at(st.size()) += 3;
else
{
v.at(st.size() + 1) *= 3;
v.at(st.size()) += v.at(st.size() + 1);
v.at(st.size() + 1)=0;
}
}
}
}
}
}
if (st.empty()) iResult = v.at(0);
else iResult = 0;
cout << iResult << endl;
return 0;
}
'알고리즘(C++) > 백준 알고리즘' 카테고리의 다른 글
| [백준] C++ 1966번 : 프린터 큐 (0) | 2019.11.08 |
|---|---|
| [백준] C++ 10845번 : 큐 (0) | 2019.11.08 |
| [백준] C++ 1874번 : 스택 수열 (0) | 2019.11.07 |
| [백준] C++ 10799번 : 쇠막대기 (0) | 2019.11.07 |
| [백준] C++ 9012번 : 괄호 (1) | 2019.11.07 |