괄호쌍은 곧 Stack 문제이다.
문제는 숫자를 계산할 때 어떻게 하냐였는데 num
이라는 변수의 초기값을 1로 셋팅하고(
와 [
를 만나면 각각 2와 3을 곱해준다.
그러다가 )
와 ]
를 만나면 계산한 값을 더해주고 각각 2와 3으로 다시 num
을 나눠준다.
이때 값을 더해주는 경우는 현재 바라보고 있는 문자(ch
)에서 이전 인덱스의 문자가 매칭되는 괄호일 경우에만 더해준다.
if (str[i - 1] === '(') answer += num;
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim();
const solution = (str) => {
const stack = [];
let answer = 0;
let num = 1;
for (let i = 0; i < str.length; i++) {
const ch = str[i];
if (ch === '(') {
stack.push('(');
num *= 2;
} else if (ch === ')') {
if (stack.length === 0) return 0;
const top = stack.pop();
if (top === '(') {
if (str[i - 1] === '(') {
answer += num;
}
num /= 2;
} else {
return 0;
}
} else if (ch === '[') {
stack.push('[');
num *= 3;
} else if (ch === ']') {
if (stack.length === 0) return 0;
const top = stack.pop();
if (top === '[') {
if (str[i - 1] === '[') {
answer += num;
}
num /= 3;
} else {
return 0;
}
}
}
if (stack.length !== 0) return 0;
return answer;
};
console.log(solution(input));
#include <bits/stdc++.h>
using namespace std;
int solution(string str) {
stack<char> S;
int sum = 0;
int num = 1;
for (int i=0; i<str.length(); i++) {
char ch = str[i];
if (ch == '(') {
num *= 2;
S.push('(');
}
else if (ch == '[') {
num *= 3;
S.push('[');
}
else if (ch == ')') {
if (S.empty() || S.top() != '(') return 0;
S.pop();
if (str[i-1] == '(') {
sum += num;
}
num /= 2;
}
else if (ch == ']') {
if (S.empty() || S.top() != '[') return 0;
S.pop();
if (str[i-1] == '[') {
sum += num;
}
num /= 3;
}
}
if (!S.empty()) return 0;
return sum;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
string str; cin >> str;
cout << solution(str) << '\n';
return 0;
}