본문 바로가기
Programming/Algorithm

백준 괄호 2504

by OKOK 2018. 1. 29.

#include <iostream>

#include <stack>

#include <string>


using namespace std;

int main() {

string n;

cin >> n;

stack<char> s;

int ans = 0, k = 0, l = 0, mul = 1;

for (int i = 0; i < n.length(); i++) {

char now = n[i];

switch(now) {

case '(' :

++k;

s.push(now);

mul *= 2;

if (i + 1 < n.length() && n[i + 1] == ')')

ans += mul;

break;

case '[' :

++l;

s.push(now);

mul *= 3;

if (i + 1 < n.length() && n[i + 1] == ']')

ans += mul;

break;

case ')' :

--k;

s.pop();

mul /= 2;

break;

case ']' :

--l;

s.pop();

mul /= 3;

break;

}

}

if (s.size() != 0 || l != 0 || k != 0) cout << 0 << endl;

else cout << ans << endl;

return 0;


진짜 하늘과 땅끝 차이인가. 이것을 어떻게 풀어나가야 하는지, 문제를 이해하는데는 그렇게 어렵지 않은데, 이것을 어떻게 가지고 저장하고 있을 것인가. 생기고 없애고 둘러쌓고 아니고 이것을 어떻게 판단할 수 있을까. 조금 더 현명하게 풀이할 수 있는 방법은 없을까? 다른 사람의 풀이를 봐서 이해하긴 했는데, 이 규칙을 어떻게 찾아낼 수 있을까, 몇가지 풀이를 한번 보도록 하겠습니다. 오케이요. 곱하고 나누고 이것을 어떻게 하는 것이지?