https://www.acmicpc.net/problem/10799
스택을 정복해보자..
실버3인데도.. 스택에 대해 익숙?? 치않아서 결국 답을봤던것같다..
그림을 좀더 확대해보자
잘보면 () 로 포인터를 쏴준다..
진짜 조금더 자세히보겟다..
이제 잘보면
()는 갈라주는역할을한다..근데 몇개를 갈라주느냐?? 바로
그전에 쌓여잇던 ( <- 의 갯수만큼 갈라준다고보면된다
즉
그러면 다음 괄호도 잘라줄수있는걸 볼수있는ㄷ ㅔ파랑색으로 표현하면
그러면 () 셋트인거는 저 앞괄호의 영향을받는다 하지만 그냥 ')' 는 어케되는가?
바로 다음 사진을 보면알수있다..
바로 끝점의 라인 한칸을 의미한다
즉
() 셋트가나오면 전에 ( 사이즈를 재주고
그냥 ) 가나온다면 +1를 해줌으로써 갯수를 카운팅해주면된다
그다음 (())를 결국 한꺼번에적용하면
이렇게볼수있다..
이거를.. 자유자재로 생각해내기가.. 답을보면.. 되는데 쉽지가않다.. 스택문제를 좀더 많이 풀어봐야겟다..
그럼 이러한 아이디어 도출이 됫다면 코딩구현은 정말간단하다
- ()체크 2. ) 체크 3. ( 그냥 넣어줌 ㅇㅇ 끝
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class 쇠막대기 {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
Stack<Character> s = new Stack<>();
String line = br.readLine();
boolean flag = false;
int count=0;
for(int i=0;i<line.length();i++) {
char current = line.charAt(i);
if(current=='(') {
s.add(current);
}
else {
s.pop(); //1쌍제거
if(line.charAt(i-1)==current) { //끝맺음임
count++;
}
else { // 한쌍셋트로 포인터슝
count+= s.size();
}
}
}
System.out.println(count);
}
}
스택공부하자..