https://www.acmicpc.net/problem/2504
- 먼저 stack을 이용해 올바른 괄호열인지 판단한다.
- 짝이 맞으면
pop
- 아니면
push
empty
면 올바른 괄호이다.top
을 체크할 때empty
를 함께 체크하여서 런타임 에러가 나지 않도록 주의하자
temp
= 1 temp
에 곱해준다.temp
의 값을 result
에 더해준다.(()[[]])([])
result = 0, temp = 1
(
result = 0, temp = 1*2 = 2
((
result = 0, temp = 2*2 = 4
(()
result = 0+4 = 4, temp = 4/2 = 2
(()[
result = 4, temp = 2*3 = 6
(()[[
result = 4, temp = 6*3 = 18
(()[[]
result = 4+18 = 22, temp = 18/3 = 6
(()[[]]
result = 22, temp = 6/3 = 2
(()[[]])
result = 22, temp = 2/2 = 1
(()[[]])(
result = 22, temp = 1*2 = 2
(()[[]])([
result = 22, temp = 2*3 = 6
(()[[]])([]
result = 22+6 = 28, temp = 6/3 = 2
(()[[]])([])
result = 28, temp = 2/2 = 1
#include <iostream>
#include <stack>
#include <string>
using namespace std;
string str;
char left2 = '(';
char left3 = '[';
char right2 = ')';
char right3 = ']';
void fastIO()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
}
bool isRightBlanket(string str)
{
stack<char> s;
for(char ch : str)
{
if (ch == left2 || ch == left3)
{
s.push(ch);
}
else if (ch == right2)
{
if (!s.empty() && s.top() == left2)
{
s.pop();
}
else // 비어있거나 top이 left3이 아닌 경우
{
s.push(ch);
}
}
else if (ch == right3)
{
if (!s.empty() && s.top() == left3)
{
s.pop();
}
else
{
s.push(ch);
}
}
}
return s.empty();
}
int solve(string str)
{
if (!isRightBlanket(str))
{
return 0;
}
int result = 0;
int temp = 1;
for(int i=0; i<str.length(); i++)
{
char target = str[i];
if (target == left2)
{
temp *= 2;
}
else if (target == left3)
{
temp *= 3;
}
else if (target == right2)
{
if (str[i-1] == left2)
{
result += temp;
}
temp /= 2;
}
else if (target == right3)
{
if (str[i-1] == left3)
{
result += temp;
}
temp /= 3;
}
}
return result;
}
void output(string str)
{
cout << solve(str) << '\n';
}
void input()
{
cin >> str;
output(str);
}
int main()
{
fastIO();
input();
return 0;
}
나중에 한번 더 풀어봐야겠다.
분배법칙을 생각 못하였고,
닫힐 때 무조건 값을 내려고 했던 생각이었는데 틀을 깨려고 해야겠다 ㅠ.ㅠ