본문 바로가기
코딩테스트/백준

[Python/Java] 백준 9012번. 괄호

by jungmin.park 2023. 11. 19.

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

 

9012번: 괄호

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

www.acmicpc.net

 

문제 설명:

문자열이 주어졌을 때 주어진 괄호 문자열이 VPS 인지 아닌지를 판단하는 문제이다.

만약 () 으로 계속 맞아떨어진다면 True 이고 )(이거나 (만 있다던가 하면 NO이다.

 

 

 

풀이:

  • flag 설정한다. 디폴트 값은 True
  • 받아온 문자열 split()으로 문자를 확인하여 "("면 스택에 넣는다.
  • 문자가 ")"이면 스택을 확인한다 가장 마지막에 들어간 문자가 "(" 이면 pop 한다. -> "( " -> 스택에 있던 문자 / ")" 받은 문자
  • 만약 받은 문자가 ")" 인데 스택에 있던 문자 ")" 라면 조건이 성립되지 않는다.
  • 받은 문자가 ")" 인데 스택에 아무것도 없다면? VPS 맞출수 있는 문자가 없기때문에 검증 할 필요 없이 break 한다.
  • 받은 문자열을 다 확인했을 때 스택에 남은 문자가 있다면 VPS가 맞지 않아 남은 문자열이기 때문에 "NO" / flag가 False 이면 조건에 걸린 것 

 

Python

n = int(input())

for case in range(n):
    data = input()
    stack = []
    flag = True
    for val in data:
        if val == "(":
        	#받아온 문자열 split()으로 문자를 확인하여 "("면 스택에 넣는다.
            stack.append(val) 
        elif val == ")" and stack:
        	#문자가 ")"이면 스택을 확인한다
            stack.pop()
        elif val == ")" and len(stack) == 0:
        	# 받은 문자가 ")" 인데 스택에 아무것도 없다면? VPS 맞출수 있는 문자가 없다
            flag = False
            break
	
    #받은 문자열을 다 확인했을 때 스택에 남은 문자가 있다면 VPS가 맞지 않아 남은 문자열이기 때문에 "NO"
    # flag가 False 이면 조건에 걸린 것
    if flag == False or stack:
        print("NO")
    else:
        print("YES")

 

Java

import java.util.Scanner;
import java.util.Stack;

public class Baekjoon_9012 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int t = in.nextInt();

        for (int i = 0; i < t; i++) {
            String sen = in.next();

            Boolean flag = true;
            Stack<String> stack = new Stack<>();

            for (String s : sen.split("")){
                if(s.equals("(")){
                    stack.push(s);
                }
                else if(s.equals(")") && !stack.isEmpty()){
                    stack.pop();
                }
                else if(s.equals(")") && stack.isEmpty()){
                    flag = false;
                    break;
                }
            }
            if(flag == false || !stack.isEmpty()){
                System.out.println("NO");
            }else{
                System.out.println("YES");
            }
        }

    }
}