import java.util.Scanner;
import java.util.Stack;
public class Test{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String string = scanner.nextLine();
Stack<Character> stack = new Stack<Character>(); //申明一个栈数据结构
char arr [] = string.toCharArray();
stack.push(arr[0]); //先将第一个字符入栈
if(arr.length == 1) { //如果string只有一个字符,说明它一定至少要补充一个
System.out.println(1);
}
else {
int count = 1; //否则,count从arr第二个字符开始执行(arr下标从0开始)
while(count != arr.length) { //遍历字符串
if(arr[count] == '(') { //如果是‘(’,入栈
stack.push(arr[count]);
}
if(arr[count] == ')') { //如果是‘)’,
if(!stack.isEmpty()) { //如果栈不空
char temp = stack.peek(); //取出栈顶元素(不删除,仍保留在栈中)
if(temp == '(') { //如果栈顶元素为‘(’
stack.pop(); //说明当前匹配括号成功,弹出栈顶元素(删除栈顶,此时已不在栈中)
}
else {
stack.push(arr[count]); //如果栈顶元素为‘)’,则入栈
}
}
else {
stack.push(arr[count]); //如果栈空,则要将‘)’入栈
}
}
count++; //继续下一个字符
}
System.out.println(stack.size()); //字符串遍历完毕后,留在栈中的括号数量,就是不匹配的括号数目,即此时栈大小
}
}
}