백준 10799번 쇠막대기 문제 - JAVA

728x90

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

 

10799번: 쇠막대기

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

www.acmicpc.net

 

받은 괄호 문자열을 하나씩 확인하면서 진행합니다.

()가 되면 레이저 이므로 이번에 들어온 문자가 ')'이고 직전에 들어온 문자가 '('이면 레이저 이므로 '()'이 완성됩니다.

'()'인 레이저를 제외하고 이전에 입력된 '('를 더합니다.

이번에 들어온 문자가 ')'이고 직전에 들어온 문자도 ')'이면 '))' 이므로 막대기를 닫는 괄호이므로 막대기 하나가 끝을 봤으니 +1을 해줍니다.

'))' 되면서 +1을 하게되는 지점입니다.

레이저로 잘라진 막대를 세는 지점입니다. '))' +1 되는 지점을 제외하고 세면 스택에 사이즈와 같게됩니다.

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 str = br.readLine();
        pipe(str);

    }
    public static void pipe(String str){
        // str 문자열 char 배열로 만들기
        char[] chars = str.toCharArray();
        // 스택 생성
        Stack<Character> stack = new Stack<>();
        // 쪼개진 새막대기 합계
        int sum = 0;
        // 직전 입력 초기화
        char tmp_c = ' ';
        // chars 반복
        for (char c: chars){
            // 여는 괄호면
            if (c == '('){
                // 스택에 푸시
                stack.push(c);
                // 닫는 괄호면
            } else if (c == ')'){
                // 직전입력 비교
                // 직전입력이 '(' 이면
                if (tmp_c == '('){
                    // 스택에서 pop
                    stack.pop();
                    // '('가 맞으면 "()" 레이저 이므로 앞에 여는 괄호 총 개수(스택의 사이즈)를 count
                    sum += stack.size();
                // 직전입력이 ')' 이면
                } else if (tmp_c == ')'){
                    // pop 가 ')'면 연속 닫는 괄호 이므로 1을 더해준다.
                    stack.pop();
                    sum += 1;
                }
            }
            // 직전 입력
            tmp_c = c;
        }
        System.out.println(sum);
    }
}

 

 

 

반응형