import java.io.*;
import java.util.*;
class Main {
public static void main(String args[]) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 입력받은 문자열을 하나의 문자로 분리하여 저장할 배열
char[] pipes = br.readLine().toCharArray();
// 후입선출의 특징을 갖는 자료구조 Stack 선언
Stack < Character > stack = new Stack < > ();
// 쇠막대기의 개수를 담을 변수
int count = 0;
// pipes배열의 길이만큼 반복문 수행
for (int i = 0; i < pipes.length; i++) {
// pipes[i]가 열린 괄호일 경우
if (pipes[i] == '(') {
stack.push(pipes[i]);
count++;
}
// pipes[i]가 닫힌 괄호일 경우
else if (pipes[i] == ')') {
// 이전 인덱스의 값이 '('일 경우
if (pipes[i - 1] == '(') {
stack.pop();
count--;
count = count + stack.size();
continue;
}
// 그 외의 경우
else {
stack.pop();
}
}
}
// 결과 출력
System.out.println(count);
}
}
해결방법
쇠막대기 문제 풀기위한 핵심 포인트는 (
와 )
의 짝을 판단하는 것이다. 바로 문제로 들어가 해설을 진행하겠다.
가장 먼저 문자열을 입력받아 pipes
배열에 넣기 위해 toCharArray
메소드를 사용하였다.
다음으로 Character
형의 stack
을 선언하고 쇠막대기의 개수를 담을 count
변수를 선언한다.
반복문은 pipes
배열의 길이만큼 반복 수행된다.
pipes
배열의 i번째 값이 (
일 경우, stack
에 넣고 count
의 값을 1 증가시킨다.
pipes
배열의 i번째 값이 )
이고 i - 1번째 값이 (
일 경우, stack
에서 꺼내고 count
의 값을 1 감소 시킨다. 그 후 count
변수에 stack
의 사이즈 만큼 더한다.
그 외의 경우 stack
에서 원소를 꺼낸다.
예를 들어 ( ( ( ( )
로 들어갔을 경우 )
를 만나기 전까지 count
의 값은 4가 될 것이고 stack
에는 (
가 4개 들어가있을 것이다.
pipes
배열의 i번째 값이 )
이 되었을 때 stack
에서 가장 마지막에 넣은 원소를 제거하고 count
의 값을 1 감소 시킨다.
()
의 모양은 레이저를 의미하기 때문에, stack
의 사이즈만큼 count
에 더해주어야한다.