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