import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
System.out.println(solve(bf.readLine()));
}
static int solve (String text) {
Stack<String> stack = new Stack<>();
int cnt = 0;
for (int i = 0; i<text.length(); i++) {
if (text.charAt(i) == '(') {
stack.push("(");
cnt++;
} else {
if (text.charAt(i-1) == '(') {
stack.pop();
cnt = (cnt-1) + (stack.size());
} else {
stack.pop();
}
}
}
return cnt;
}
}
스택과 int 변수하나를 받아서 진행형인 막대기 수와 지금까지 총 막대기 수를 체크하면 쉽게 풀 수 있었다.