백준 10799 쇠막대기 자바

노문택·2022년 2월 12일
0

https://www.acmicpc.net/problem/10799
스택을 정복해보자..
실버3인데도.. 스택에 대해 익숙?? 치않아서 결국 답을봤던것같다..

그림을 좀더 확대해보자

잘보면 () 로 포인터를 쏴준다..

진짜 조금더 자세히보겟다..

이제 잘보면
()는 갈라주는역할을한다..근데 몇개를 갈라주느냐?? 바로
그전에 쌓여잇던 ( <- 의 갯수만큼 갈라준다고보면된다


그러면 다음 괄호도 잘라줄수있는걸 볼수있는ㄷ ㅔ파랑색으로 표현하면

그러면 () 셋트인거는 저 앞괄호의 영향을받는다 하지만 그냥 ')' 는 어케되는가?
바로 다음 사진을 보면알수있다..

바로 끝점의 라인 한칸을 의미한다

() 셋트가나오면 전에 ( 사이즈를 재주고
그냥 ) 가나온다면 +1를 해줌으로써 갯수를 카운팅해주면된다

그다음 (())를 결국 한꺼번에적용하면

이렇게볼수있다..

이거를.. 자유자재로 생각해내기가.. 답을보면.. 되는데 쉽지가않다.. 스택문제를 좀더 많이 풀어봐야겟다..

그럼 이러한 아이디어 도출이 됫다면 코딩구현은 정말간단하다

  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);
	}

}

스택공부하자..

profile
노력하는 뚠뚠이

0개의 댓글