[백준] 쇠막대기

김현진·2022년 1월 19일
0

코테준비

목록 보기
21/22
  • 문제 해결 :
    레이저는 인접한 ()로 표현한다.
    쇠막대기의 시작과 끝은 인접하지 않은 ()로 표현된다.
    각 쇠막대기를 자르는 레이저는 적어도 하나 존재한다.
    레이저는 어떤 쇠막대기의 양 끝점과도 겹치지 않는다.

    이 문제는 쇠막대기들과 레이저가 주어졌을 때 쇠막대기가 몇 개로 분할 될것인지를
    구하는 문제이다.
    앞에서부터 차례대로 ( 와 ) 가 나왔을 때 ( 는 쇠막대기의 시작 또는 레이저의 시작을,
    ) 는 쇠막대기의 끝 또는 레이저의 끝을 나타냈기 때문에,
    ) 가 레이저를 의미할때는 현재 걸쳐있는 파이프의 수 만큼 더해지고,
    파이프를 의미할 때는 파이프의 끝이므로 1을 더해주면 되었다.
    또한 괄호의 순서대로 삽입하고 짝이 맞다면 더이상 필요가 없기 때문에 삭제해주면 되었는데, 이를 위해 스택으로 구현하였다.
    스택으로 구현할 때, ) 가 나왔을 때 레이저를 구분하는 것은 현재 스택의 peek와 비교하여 ( 이라면 레이저, ) 라면 파이프로 구분을 해주었다.
public class Q10799 {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Stack<Integer> stack = new Stack<>();

        String s = br.readLine();


        int sum = 0;

        for(int i=0;i<s.length();i++){

            char c = s.charAt(i);

            if(c == '('){ // 파이프 또는 레이저의 시작
                stack.push(i); // 인덱스를 삽입
            }else{ // '(' 일때
                if(i-1 == stack.peek()){ 
                // 피크과 인덱스 차이가 1이라면 붙어있는 것 -> 레이저
                    stack.pop();
                    sum += stack.size();
                }else{
                // 아니라면 파이프
                    stack.pop();
                    sum += 1;
                }
            }
        }

        System.out.println(sum);
    }
}

0개의 댓글