View

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

 

9012번: 괄호

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고

www.acmicpc.net

📚 문제

괄호 문자열(PS)는 두 개의 괄호 기호인 '('와 ')'만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(VPS)이라고 부른다. 한 쌍의 괄호 기호로 된 "( )" 문자열은 기본 VPS 이라고 부른다. 만일 X가 VPS 라면 이것을 하나의 괄호에 넣은 새로운 문자열 "(x)"도 VPS가 된다. 그리고 두 VPS x와 y를 접합시킨 새로운 문ㄴ자열 xy도 VPS가 된다. 예를 들어 “(())()”와 “((()))” 는 VPS 이지만 “(()(”, “(())()))” , 그리고 “(()” 는 모두 VPS 가 아닌 문자열이다. 

여러분은 입력으로 주어진 괄호 문자열이 VPS 인지 아닌지를 판단해서 그 결과를 YES와 NO로 나타내어야 한다.

 

📝 문제 해결

  • '(' 가 들어올 경우 스택에 저장해주고 stack.push()
  • ')' 일 경우에는 
    • 스택이 비어있다면( '(' 가 없다면 )  ')'를 stack에 저장하고 반복을 종료
    • 스택이 비어있지 않다면( '('가 존재한다면) stack의 값을 빼준다. stack.pop()
  • 마지막으로 모든 탐색이 끝났는데 stack이 비어있지 않으면 NO 출력

 

💻 코드

package algorithm;

import java.io.*;
import java.util.Stack;

public class BOJ9012 {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());

        for(int i = 0; i < T; i++) {
            String input = br.readLine();

            Stack<Character> stack = new Stack<Character>();

            for(int j = 0; j < input.length(); j++) {
                if(input.charAt(j) == '(') {
                    stack.push(input.charAt(j));
                }else {
                    if(stack.empty()) {
                        stack.push(input.charAt(j));
                        break;
                    }else {
                        stack.pop();
                    }
                }
            }
            if(stack.empty()) System.out.println("YES");
            else System.out.println("NO");
        }
    }

}
728x90
Share Link
reply
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31