본문 바로가기

Baekjoon

[Java] 백준 9012번 : 괄호

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

 

9012번: 괄호

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

www.acmicpc.net

[첫 접근]

 이 문제를 보고 '(' 와 ')' 의 개수가 같은지 비교하여 풀려고 하였다. 하지만 이렇게 풀면 안되는 예시가 있다.

백준에서 제시한 '())(()' 예시를 보면 내가 생각한 풀이론 안되었다. 왜냐하면 개수는 같다 하더라도 문제에서 말하는 완벽한  괄호가 되지 않기 때문이다.

 

[풀이]

 따라서 '(' 와 ')'의 개수가 같은지 판단하지않고 '(' 일때는 1을 더해주고, ')' 일때는 1을 빼주어 count 변수의 값에 따라 "YES"인지 "NO"인지 판별하기로 하였다.  count 가. -1이 되는 순간엔 완벽한 괄호가 될 수 없으므로 반복문을 빠져 나와  "NO"를 출력해준다.

반복문을 전부 돌아 count값이 0 이면 완벽한 괄호이기때문에 "YES"를 출력하고 0이 아닌 다른 수라면 "NO"를 출력해주면 된다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main9012 {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int N = Integer.parseInt(br.readLine());

        while (N--> 0){

            int count = 0;
            
	//이런식으로 getBytes()를 이용하여 문자를 하나하나 비교할수 있는 법을 알게 되었다!
            for(Byte b : br.readLine().getBytes()){
                if (b=='('){
                     count++;
                }
                else {
                     count --;
                }
                if(count < 0){
                    break;
                }
            }
            if(count==0){
                sb.append("YES").append("\n");

            }else {
                sb.append("NO").append("\n");
            }

        }

        System.out.print(sb);

    }
}

 

'Baekjoon' 카테고리의 다른 글

[Java] 백준 1874번 : 스택 수열  (0) 2022.01.15
[Java] 백준 10828번 : 스택  (0) 2022.01.14
[Java] 백준 10845번 : 큐  (0) 2022.01.12
[Java] 백준 10866번 : 덱  (0) 2022.01.12
[Java] 백준 1966번 : 프린터 큐  (0) 2022.01.12