[백준]#4889 안정적인 문자열

SeungBird·2020년 8월 31일
0

⌨알고리즘(백준)

목록 보기
192/401

문제

여는 괄호와 닫는 괄호만으로 이루어진 문자열이 주어진다. 여기서 안정적인 문자열을 만들기 위한 최소 연산의 수를 구하려고 한다. 안정적인 문자열의 정의란 다음과 같다.

  1. 빈 문자열은 안정적이다.
  2. S가 안정적이라면, {S}도 안정적인 문자열이다.
  3. S와 T가 안정적이라면, ST(두 문자열의 연결)도 안정적이다.

{}, {}{}, {{}{}}는 안정적인 문자열이지만, }{, {{}{, {}{는 안정적인 문자열이 아니다.

문자열에 행할 수 있는 연산은 여는 괄호를 닫는 괄호로 바꾸거나, 닫는 괄호를 여는 괄호로 바꾸는 것 2가지이다.

입력

입력은 여러 개의 데이터 세트로 이루어져 있다. 각 데이터 세트는 한 줄로 이루어져 있다. 줄에는 여는 괄호와 닫는 괄호만으로 이루어진 문자열이 주어진다. 문자열의 길이가 2000을 넘는 경우는 없고, 항상 길이는 짝수이다.

입력의 마지막 줄은 '-'가 한 개 이상 주어진다.

출력

각 테스트 케이스에 대해서, 테스트 케이스 번호와 입력으로 주어진 문자열을 안정적으로 바꾸는데 필요한 최소 연산의 수를 출력한다.

예제 입력 1

}{
{}{}{}
{{{}
---

예제 출력 1

1. 2
2. 0
3. 1

풀이

이 문제는 Stack을 이용한 괄호 문자열의 처리 문제이다.

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

public class Main {
    static Stack<Character> stack = new Stack<>();

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = 1;

        while(true) {
            String input = br.readLine();
            if(input.charAt(0)=='-') break;

            int cnt = 0;
            for(int i=0; i<input.length(); i++) {
                char c = input.charAt(i);
                if(c=='{') stack.push(c);

                else {
                    if(stack.size()!=0 &&stack.peek()=='{') stack.pop();

                    else stack.push('}');
                }
            }
            if(stack.size()==0) System.out.println(T+". "+cnt);

            else {
                while(!stack.isEmpty()) {
                    char c1 = stack.pop();
                    char c2 = stack.pop();

                    if(c1==c2) cnt++;
                    else cnt+=2;
                }
                System.out.println(T+". "+cnt);
            }

            T++;
        }
    }
}
profile
👶🏻Jr. Programmer

0개의 댓글