괄호문제, 좋은 단어, 탑 문제 등을 풀어보니 이제 알고리즘에서 Stack을 어떻게 활용하는지 알 것 같다.
분명히 Stack은 과거의 기록을 기록하기 위한 것이라고 배웠는데도 지금까지 막연하게 거꾸로 data를 저장하는 객체라고 생각했었다.
지금 느끼는 것은 당연한 얘기일 수 있겠지만 가장 최근에 저장한 데이터를 계속 활용해야 하는 상황을 인지하는 것이 중요한 것 같다.
문제풀이
( -> 막대기가 쌓임
() -> 레이저로 자름 _쌓인 막대기만큼 조각이 생김
) -> 쌓인 막대기가 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> stack = new Stack<>();
int sticks = 0;
int peice = 0;
for(int i = 0; i < str.length(); i++){
char nowChar = str.charAt(i);
if(stack.isEmpty()){
sticks++;
stack.push(nowChar);
}else{
char peek = stack.peek();
if(nowChar == '('){
// 일단 push
sticks++;
stack.push(nowChar);
}else if(nowChar == ')'){
if(peek == '('){
// 레이저로 자른 경우
sticks--;
peice += sticks;
stack.push(nowChar);
}else if(peek == ')'){
// 막대기 한개-- 인 경우
sticks--;
peice++;
stack.push(nowChar);
}
}
}
}
System.out.println(peice);
}
}
다 풀고보니 스택이 꼭 필요한 문제는 아닌 것 같지만 문제 분류는 스택에 포함되어 있다.