//  #牛客春招刷题训练营# https://www.nowcoder.com/discuss/726480854079250432
//  思路来自昨天写的【染色问题】(https://gw-c.nowcoder.com/api/sparta/jump/link?link=https%3A%2F%2Fwww.nowcoder.com%2Fpractice%2F512619bee5874e85bd2812a0c9066125%3FchannelPut%3Dw25springcamp)
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
/*int finans = 0; 失败于“([([])]”
string s;
int rfind (string& ss, char c, int index){
  for (; index >= 0; index--){
    if (ss[index] == c) break;
  }
  return index;
}
void solve(int l, int r){
  if (l > r) return;
  if (s[l] == ')') {
    finans++;
    solve(l + 1, r);
  }
  else if (s[l] == ']'){
    finans++;
    solve(l + 1, r);
  }
  else if (s[l] == '('){
    int next = rfind(s, ')', r);
    if (next < l || next == -1) {
      finans++;
      solve(l + 1, r);
    }
    else{
      solve(l + 1, next - 1);
      solve(next + 1, r);
    }
  }
  else{
    int next = rfind(s, ']', r);
    if (next < l || next == -1){
      finans++;
      solve(l + 1, r);
    }
    else{
      solve(l + 1, next - 1);
      solve(next + 1, r);
    }
  }
}
int main() {
  cin >> s;
  size_t size = s.size();
  solve(0, size - 1);
  cout << finans;
}
// 64 位输出请用 printf("%lld")*/
char dp[110][110]{ 0 };//----------最多只有100个括号,dp【i】【j】表示索引i~j区间中需要添加的最少括号
int main() {
  string s;
  cin >> s;
  size_t size = s.size();
  for (int len = 1; len <= size; len++) {//---------从小到大枚举长度
    for (int i = 0; i < size; i++) {
      int j = i + len - 1;
      if (j >= size) break;
      if (i == j) dp[i][j] = 1;//----------只有一个括号必须要补
      else {
        dp[i][j] = 110;
        if (s[i] == '(' && s[j] == ')' || s[i] == '[' && s[j] == ']') {//----如果匹配
          if (i == j - 1) dp[i][j] = 0;//--------修正一个括号时的‘1’
          else dp[i][j] = dp[i + 1][j - 1];
        }
        for (int k = i; k < j; k++) dp[i][j] = min(static_cast<int>(dp[i][j]), static_cast<int>(dp[i][k] + dp[k + 1][j]));//----------这里注意就算匹配成功也要枚举避免样例“[])[[)]”的答案从3变成5
      }
    }
  }
  cout << static_cast<int>(dp[0][size - 1]);//----------记得类型转换
  return 0;
}