문제 링크
https://www.acmicpc.net/problem/10799
최종 코드(정답)
import java.io.BufferedReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new java.io.InputStreamReader(System.in));
String brackets = br.readLine();
int bracketCount = 0;
int total = 0;
for (int i = 0; i < brackets.length(); i++) {
char bracket = brackets.charAt(i);
if (bracket == '(') {
bracketCount++;
} else {
bracketCount--; // 오답노트~ 이거 무조건 else에서 해줘야 함~
char prevBracket = brackets.charAt(i-1);
if (prevBracket == '(') {
// 이전 괄호가 (라면 ()이므로 bracketCount만큼 자른다.
total += bracketCount;
} else {
// 그냥 ))이므로 하나만 더한다.
total++;
}
}
}
System.out.println(total);
}
}
풀이
복습하면서 블로그 올린다.
)가 나오면 stack.pop()을 하든 변수값을 --하든 해야 한다.
이게 왜냐면, ()가 완성되어서 쇠막대기들이 일괄로 잘릴 때도 ((((은 4개인데 실제로 생성되는 쇠막대기들은 3개이기 때문이다.
또 ))처럼 닫기 괄호만 계속 나와도
)가 있다는 것은 (이 이전에 있다는 뜻이다.
괄호가 종결되었으므로 기존의 (는 total++을 제외하고 앞으로 쇠막대기들을 자를 때 생성 횟수에 관여할 수 없다.
그래서 무조건 -- 해야 한다.
결론적으로 )면 무조건 --를 하고,
기존 괄호가 (인지 )인지 여부에 따라서 일괄 자르기를 할 것인지, 막대기 개별 종료를 할 것인지 판별하면 될 것이다.
bracketCount--; // 오답노트~ 이거 무조건 else에서 해줘야 함~
char prevBracket = brackets.charAt(i-1);
if (prevBracket == '(') {
// 이전 괄호가 (라면 ()이므로 bracketCount만큼 자른다.
total += bracketCount;
} else {
// 그냥 ))이므로 하나만 더한다.
total++;
}