Algorithm/Baekjoon Online Judge

[BOJ-JAVA] 10799번: 쇠막대기

mirae.kwak 2023. 4. 17. 15:07
728x90

문제

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

 

10799번: 쇠막대기

여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저

www.acmicpc.net

다음과 같이 괄호로 이루어진 문장이 주어질 때 막대기의 개수를 세는 문제이다.

  • 괄호는 레이저를 나타낸다.
    • 괄호 안에 포함된 가장 안쪽 괄호가 레이저가 된다.
  • 모든 막대기는 괄호를 포함한다.
  • 막대기에 대해 가장 안쪽 괄호 기준으로 나누었을 때 막대기 개수를 구해야한다.

 

문제 풀이

보통의 괄호를 이용한 문제는 stack을 이용해 해결할 수 있다.

  • "("가 나올 경우 stack에 push
  • ")"가 나올 경우 stack에서 pop

다음과 같은 규칙을 찾을 수 있다.

  • 단순히 하나의 괄호 쌍 "()"에 대해서는 개수를 세지 않는다.
    • 레이저이기 때문
  • 하나의 레이저를 지나갈 때 잘라진 막대기 개수를 센다.
    • 잘라진 막대기 개수는 stack의 size, 즉 (의 개수와 같다. (레이저 괄호 제외)
  • 연속으로 ")"가 나올 때는 막대기 개수가 1만 증가한다.

 

Java Code

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = br.readLine();
        Stack<Character> stack = new Stack<>();
        int count = 0;
        for(int i=0; i<line.length(); i++) {
            if(line.charAt(i) == '(') {
                stack.push('(');
            }
            else{
                if(line.charAt(i-1) == ')') {
                    count++;
                }
                else if(stack.size() > 1) {
                    count += stack.size()-1;
                }
                stack.pop();
            }
        }
        System.out.println(count);
    }
}

 

728x90