문제를 읽고 어떻게 풀어야 하는지 전혀 감이 오지 않았다....
우선 문자열을 입력을 받는다.
문자열을 구성하는 문자는 '(' 또는 ')' 이다.
1. '('가 입력된 경우에는 스택에 push해준다.
2. ')'가 입력된 경우는 두 가지 케이스로 다시 나눠볼 수 있다.
2-1. 이전 문자가 '('일 경우, 즉 레이저인 경우
스택에 있던 '('를 pop하고 스택의 크기(= 쇠막대기의 개수)만큼 더해준다.
2-2. 이전 문자가 ')'일 경우, 즉 한 막대기의 끝일 경우
스택에 있던 '('를 pop하고 1을 더해준다.
한 막대기의 끝을 나타내는 ')'일 경우 1을 더해주는 이유는 위 그림을 보면 이해가 갈 것이다.
그 막대는 더 이상 쪼개질 일이 없기 때문에 그 마지막 조각의 개수인 1을 더해주는 것이다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 문자열을 입력받음
String str = br.readLine();
// 문자열을 구성하는 문자들을 저장할 스택을 생성
Stack<Character> s = new Stack<Character>();
// 잘린 막대의 개수를 셀 변수
int res = 0;
// 입력받은 문자열의 길이만큼 반복
for(int i=0;i<str.length();i++) {
// 문자열의 한 글자씩 읽음
char c = str.charAt(i);
// '(' 이라면 스택에 push
if(c=='(') {
s.push(c);
}
// ')' 이라면
else if(c==')'){
// 스택에 들어있던 '(' 를 pop
s.pop();
// 직전에 입력된 문자가 '(' 이었다면 == 레이저라면
if(str.charAt(i-1)=='(') {
// 스택의 크기(= 쇠막대기의 개수)만큼 더해줌
res += s.size();
}
// 직전에 입력된 문자가 ')' 이었다면 == 한 막대기의 끝이라면
else {
// 1을 더해줌
res += 1;
}
}
}
// 잘린 막대기의 총 개수를 출력함
System.out.println(res);
}
}
'[BOJ] - JAVA' 카테고리의 다른 글
[백준] 1934 : 최소공배수 JAVA 풀이 (0) | 2022.09.29 |
---|---|
[백준] 2609 : 최대공약수와 최소공배수 (0) | 2022.09.29 |
[백준] 10845 : 큐 JAVA 풀이 (0) | 2022.09.19 |
[백준] 9012 : 괄호 JAVA 풀이 (0) | 2022.09.19 |
[백준] 10828 : 스택 JAVA 풀이 (0) | 2022.09.19 |