ALGORITHM

[JAVA] 백준 10799번- 쇠막대기

연듀 2022. 7. 15. 12:00

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

 

10799번: 쇠막대기

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

www.acmicpc.net

import java.util.*;


public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();

        int answer=0;
        Stack<Character> stack = new Stack<>();

        for(int i=0; i<str.length(); i++){
            if(str.charAt(i)=='(') stack.push('('); // 여는 괄호면 스택에 추가
            else{ // 닫는 괄호면
                stack.pop();
                if(str.charAt(i-1)=='(') answer+=stack.size(); // 레이저일 경우
                else answer++; // 막대기의 끝일 경우
            }
        }
        System.out.println(answer);
    }
}

 

 

여는 괄호를 만나면 무조건 스택에 푸시한다.

닫는 괄호를 만날경우 막대기의 끝을 나타내는지, 만들어지는 괄호의 쌍이 레이저를 나타내는지 구별해야한다.

구별하려면 그 닫는 괄호 바로 앞의 것을 보면 된다. 열린 괄호라면 쌍이 만들어지기 때문에 레이저이다.

그 레이저의 여는 괄호를 pop시킨다. 그러고나면 남아있는 여는 괄호들은 다 토막난 막대기이므로 스택의 사이즈를 answer에 추가시킨다. 

닫는 괄호를 만났을 때 바로 앞의 것이 여는 괄호가 아니라면, 막대기의 끝을 나타낸다.

이럴 땐 바로 앞의 것인 여는 괄호를 pop시키고 막대기 끝의 하나를 answer에 추가한다.