본문 바로가기
알고리즘 문제 (백준저지)/DP

[백준/9012] 괄호 (Java/코드)

by 유헤 2018. 12. 26.

이 문제는 스택의 기초중에 기초라고 불리는 알고리즘 문제다.

보통 계산기 문제를 사용할 때 괄호 값을 체크하는 용도로 쓰입니다.




문제

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

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

입력

입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 주어진다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫째 줄에는 괄호 문자열이 한 줄에 주어진다. 하나의 괄호 문자열의 길이는 2 이상 50 이하이다. 

출력

출력은 표준 출력을 사용한다. 만일 입력 괄호 문자열이 올바른 괄호 문자열(VPS)이면 “YES”, 아니면 “NO”를 한 줄에 하나씩 차례대로 출력해야 한다. 


출력코드1


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
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        for( int i= 0 ; i<n ; i++ ){
            
            String str = sc.next();
            String[] arr =str.split("");
            int cnt = 0;
            for (int j=0 ; j < arr.length ; j ++ ){
                if(arr[j].equals("(")){
                    cnt++;
                } else if (arr[j].equals(")")){
                    cnt--;
                }
                if(cnt < 0){
                    System.out.println("NO");
                    break;
                }
            }
            if(cnt >=0)
                System.out.println(cnt>0?"NO":"YES");    
        }
    }
}
 
cs

위와 같이, split / 삼항 연산자를 사용하여서 푸는 방법과


출력코드2


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
32
33
34
import java.util.*;
import java.math.*;
 
public class Main{
    public static String isValid(String word) {  
         word = word.trim();
         char[] arr = word.toCharArray();
         int cnt = 0;
         
         for(int i =0; i<arr.length; i++){
             if(arr[i]=='(')   
               cnt=cnt+1;
            else 
                cnt=cnt-1;
            if(cnt<0){              
                return "NO";
            }
          }   
 
           if(cnt==0) 
                return "YES";
           else
                return "NO";     
    }
 
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.nextLine();
        while (n-- > 0) {
            System.out.println(isValid(sc.nextLine()));
        }
    }
}
cs

직관성 면에서 어떤게 나을진 모르겠지만, 일단 출력코드2 가 조금은 더 빨리 나오는 것을 확인 할 수 있다.