#include <bits/stdc++.h>
using namespace std;
const int MAXN = 110;
int dp[MAXN][MAXN];

int main()
{
    string s; cin >> s;
    int n = s.size();
    
    //对不括号不匹配的区间就标记为1操作
    for (int i = 0; i < n-1; i++) {
        if ((s[i] == '(' && s[i+1] == ')') || (s[i] == '[' && s[i+1] == ']')) {
            dp[i][i+1] = 0;
        } else {
            dp[i][i+1] = 1;
        }
    }

    //记得要从单个长度查起,因为后面的状态会依赖前面的状态
    for (int len = 0; len < n; len++) {
        for (int i = 0; i < n - len; i++) {
            int j = i + len;
            //先枚举分割点,然后枚举左右括号的匹配情况
            dp[i][j] = min(dp[i+1][j] + 1, dp[i][j-1] + 1);
            
            //特判相同情况
            if ((s[i] == '(' && s[j] == ')') || (s[i] == '[' && s[j] == ']')) {
                dp[i][j] = min(dp[i][j], dp[i+1][j-1]);
            }
            
            //枚举分割点
            for (int k = i; k < j; k++) {
                dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j]);
            }
        }
    }
    cout << dp[0][n-1] << endl;
    return 0;
}