알고리즘/스텍

[백준] 10799 : 쇠막대기 (JAVA)

믕비 2025. 4. 23. 17:20
반응형

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

 

[풀이과정]

막대기를 자르는 레이저의 개수 + 1만큼 막대기가 증식함.

 

1) '(' 일 때

stack에 넣어줌

 

2) ')' 일 때 -> 두 가지 경우로 나뉨

먼저 pop해서 '('를 제거

2-1) 레이저의 끝일 때

stack에 있는 막대기 모두를 자르기 때문에 +stack.size를 해줌

 

2-2) 막대기의 끝일 때

+1 해주기

 

[코드]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;
/*
쇠막대기를 겹침.
자신보다 긴 막대기 위에만 놓일 수 있음.
레이저는 어떤 쇠막대기의 양 끝점과도 겹치지 않음

'()' : 레이저
'(',')' : 막대기의 양 끝
 */
public class Main {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer st;
    static String env;
    static Stack<Character> stack;
    static Stack<Integer> laser;

    public static void main(String[] args) throws IOException {
        init();
        System.out.print(devide());
    }

    static void init() throws IOException{
        env = br.readLine();
        stack = new Stack<>();
        laser = new Stack<>();
    }

    static int devide(){
        int result = 0;

        for(int i = 0; i < env.length(); i++){
            char now = env.charAt(i);

            if(now == '('){
                stack.push(now);
            }
            else if(now == ')'){
                stack.pop();
                //레이저 끝일 때
                if(env.charAt(i - 1) == '('){
                    result += stack.size();
                }
                //막대기 끝일 때
                else {
                    result++;
                }
            }
        }
        return result;
    }
}

반응형