Algorithm/Java

[백준/JAVA] 쇠막대기

dbfl9911 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);
    }
}
반응형