728x90
https://www.acmicpc.net/problem/10799
받은 괄호 문자열을 하나씩 확인하면서 진행합니다.
()가 되면 레이저 이므로 이번에 들어온 문자가 ')'이고 직전에 들어온 문자가 '('이면 레이저 이므로 '()'이 완성됩니다.
'()'인 레이저를 제외하고 이전에 입력된 '('를 더합니다.
이번에 들어온 문자가 ')'이고 직전에 들어온 문자도 ')'이면 '))' 이므로 막대기를 닫는 괄호이므로 막대기 하나가 끝을 봤으니 +1을 해줍니다.
'))' 되면서 +1을 하게되는 지점입니다.
레이저로 잘라진 막대를 세는 지점입니다. '))' +1 되는 지점을 제외하고 세면 스택에 사이즈와 같게됩니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws IOException {
// 문자열 입력
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
pipe(str);
}
public static void pipe(String str){
// str 문자열 char 배열로 만들기
char[] chars = str.toCharArray();
// 스택 생성
Stack<Character> stack = new Stack<>();
// 쪼개진 새막대기 합계
int sum = 0;
// 직전 입력 초기화
char tmp_c = ' ';
// chars 반복
for (char c: chars){
// 여는 괄호면
if (c == '('){
// 스택에 푸시
stack.push(c);
// 닫는 괄호면
} else if (c == ')'){
// 직전입력 비교
// 직전입력이 '(' 이면
if (tmp_c == '('){
// 스택에서 pop
stack.pop();
// '('가 맞으면 "()" 레이저 이므로 앞에 여는 괄호 총 개수(스택의 사이즈)를 count
sum += stack.size();
// 직전입력이 ')' 이면
} else if (tmp_c == ')'){
// pop 가 ')'면 연속 닫는 괄호 이므로 1을 더해준다.
stack.pop();
sum += 1;
}
}
// 직전 입력
tmp_c = c;
}
System.out.println(sum);
}
}
728x90
'알고리즘 with JAVA' 카테고리의 다른 글
백준 10926 - 자바 (JAVA) (0) | 2022.05.31 |
---|---|
백준 4949번 균형잡힌 세상 (JAVA) (0) | 2022.05.24 |
백준 10773번: 제로 문제 (JAVA) 스택문제 (0) | 2022.05.18 |
백준 10828번 문제 - 스택 (JAVA) (0) | 2022.05.16 |
JAVA 소수 구하기 - 에라토스테네스의 체 (0) | 2021.08.08 |