- 문제 해결 :
레이저는 인접한 ()로 표현한다.
쇠막대기의 시작과 끝은 인접하지 않은 ()로 표현된다.
각 쇠막대기를 자르는 레이저는 적어도 하나 존재한다.
레이저는 어떤 쇠막대기의 양 끝점과도 겹치지 않는다.
이 문제는 쇠막대기들과 레이저가 주어졌을 때 쇠막대기가 몇 개로 분할 될것인지를
구하는 문제이다.
앞에서부터 차례대로 ( 와 ) 가 나왔을 때 ( 는 쇠막대기의 시작 또는 레이저의 시작을,
) 는 쇠막대기의 끝 또는 레이저의 끝을 나타냈기 때문에,
) 가 레이저를 의미할때는 현재 걸쳐있는 파이프의 수 만큼 더해지고,
파이프를 의미할 때는 파이프의 끝이므로 1을 더해주면 되었다.
또한 괄호의 순서대로 삽입하고 짝이 맞다면 더이상 필요가 없기 때문에 삭제해주면 되었는데, 이를 위해 스택으로 구현하였다.
스택으로 구현할 때, ) 가 나왔을 때 레이저를 구분하는 것은 현재 스택의 peek와 비교하여 ( 이라면 레이저, ) 라면 파이프로 구분을 해주었다.
public class Q10799 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Stack<Integer> stack = new Stack<>();
String s = br.readLine();
int sum = 0;
for(int i=0;i<s.length();i++){
char c = s.charAt(i);
if(c == '('){
stack.push(i);
}else{
if(i-1 == stack.peek()){
stack.pop();
sum += stack.size();
}else{
stack.pop();
sum += 1;
}
}
}
System.out.println(sum);
}
}