https://www.acmicpc.net/problem/10799
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
int answer=0;
Stack<Character> stack = new Stack<>();
for(int i=0; i<str.length(); i++){
if(str.charAt(i)=='(') stack.push('('); // 여는 괄호면 스택에 추가
else{ // 닫는 괄호면
stack.pop();
if(str.charAt(i-1)=='(') answer+=stack.size(); // 레이저일 경우
else answer++; // 막대기의 끝일 경우
}
}
System.out.println(answer);
}
}
여는 괄호를 만나면 무조건 스택에 푸시한다.
닫는 괄호를 만날경우 막대기의 끝을 나타내는지, 만들어지는 괄호의 쌍이 레이저를 나타내는지 구별해야한다.
구별하려면 그 닫는 괄호 바로 앞의 것을 보면 된다. 열린 괄호라면 쌍이 만들어지기 때문에 레이저이다.
그 레이저의 여는 괄호를 pop시킨다. 그러고나면 남아있는 여는 괄호들은 다 토막난 막대기이므로 스택의 사이즈를 answer에 추가시킨다.
닫는 괄호를 만났을 때 바로 앞의 것이 여는 괄호가 아니라면, 막대기의 끝을 나타낸다.
이럴 땐 바로 앞의 것인 여는 괄호를 pop시키고 막대기 끝의 하나를 answer에 추가한다.
'ALGORITHM' 카테고리의 다른 글
[JAVA] 백준 20920번- 영단어 암기는 괴로워 (0) | 2022.07.17 |
---|---|
[JAVA] 백준 1874번- 스택 수열 (0) | 2022.07.16 |
[JAVA] 백준 1158번- 요세푸스 문제 (0) | 2022.07.15 |
[JAVA] 알고리즘 : Queue- 응급실 (0) | 2022.07.15 |
[JAVA] 알고리즘 : Queue- 교육과정설계 (0) | 2022.07.14 |