boj 2504 c++ 괄호의 값
백준 2504 cpp 괄호의 값
아이디어
- 한
line을 받는다.
temp = 1, ans = 0, bool iserror = false 을 선언한다.
line[i] 가 ( 이거나 [ 일 때에는 temp에 2 or 3 을 곱하고, 스택에 넣는다.
line[i] 가 ) or ] 일 때에는 temp를 2 or 3으로 나눈다. 또, 스택에서 하나를 뺀다.
- ans 에 temp 를 추가하는 시점은
line[i-1] 이 닫히는 괄호와 짝을 이룰 때이다.
) or ] 을 만났는데 스택이 비었거나 스택의 맨 위에 짝이 맞지 않는 경우 iserror=true 해주고 break 한다.
(()()() 같은 경우를 대비해 for문을 빠져 나왔을 때에도 Stack이 비었는지 확인해준다.
- ans를 출력한다.
#include <bits/stdc++.h>
using namespace std;
string line;
stack<char> S;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> line;
int temp = 1;
int ans = 0;
bool iserror = false;
for (int i = 0; i < line.size(); i++)
{
char c = line[i];
if (c == '(')
{
temp *= 2;
S.push(c);
}
else if (c == '[')
{
temp *= 3;
S.push(c);
}
else if (c == ')')
{
if (S.empty() || S.top() != '(')
{
iserror = true;
break;
}
else
{
if (line[i-1] == '(')
ans += temp;
temp /= 2;
S.pop();
}
}
else // (c == ']')
{
if (S.empty() || S.top() != '[')
{
iserror = true;
break;
}
else
{
if (line[i-1] == '[')
ans += temp;
temp /= 3;
S.pop();
}
}
}
if (iserror == true || !S.empty())
cout << 0;
else
cout << ans;
}
최근댓글