ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준/JAVA] 쇠막대기
    Algorithm 2024. 10. 19. 15:42

    https://www.acmicpc.net/problem/10799


    - 문제 풀이

    (https://steady-coding.tistory.com/10 님 문제 풀이 참고)

     

    스택 알고리즘 사용

    • 여는 괄호가 나올 때마다 스택에 추가합니다. 이는 쇠막대기의 시작을 의미하므로 각 막대기가 어디서 시작했는지 기록하는 용도입니다.
    • 닫는 괄호가 나올 때 처리 방식은 두 가지입니다:
      • 바로 이전 문자가 '('이면, 이는 레이저를 의미합니다. 현재 스택에 있는 쇠막대기 수만큼 조각이 추가됩니다. ( 괄호가 닫히기전에 레이저를 쏘면 남은 '(' 만큼 갯수가 늘어남)
      • 이전 문자가 ')'이면, 이는 막대기의 끝을 의미하므로 막대기가 하나 끝났고 조각이 하나 추가됩니다. ( 사진을 보면 ')'가 연속해 있으면 단순히 막대기만 하나더 들어옴)

     

     

    1. '('을 만났을 때

      ➜ stack에 '('을 push한다

    2. ')'을 만났을 때

      ➜ stack에서 pop한다

        2-1. ')' 바로 전 문자가 '('일 때

               레이저이므로 stack 사이즈만큼 더해준다!

        2-2. ')' 바로 전 문자가 ')'일 때

              ➜  그냥 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 s = br.readLine();
            Stack<Character> stack = new Stack<>();
            int answer = 0;
    
            for(int i = 0; i < s.length(); i++) {
                if(s.charAt(i) == '(') {
                    stack.push('(');
                }else { // s.charAt(i) == ')'
                    stack.pop();
                    if(s.charAt(i-1) == '(') { // 레이저를 의미
                        answer += stack.size();
                    }else{ // ')'
                        answer += 1;
                    }
                }
            }
            System.out.println(answer);
        }
    }

    'Algorithm' 카테고리의 다른 글

    [백준/JAVA] 2493번: 탑  (0) 2024.10.19
    [백준/JAVA] 괄호의 값  (0) 2024.10.19
    [백준/JAVA] 스택 수열  (0) 2024.10.19
    [백준/JAVA] 프린터 큐  (0) 2024.10.17
    [백준/JAVA] 후위 표기식2  (0) 2024.10.17
Designed by Tistory.