알고리즘/백준

BOJ) 균형잡힌 세상

Zin0_0 2020. 6. 23. 21:34
반응형

균형잡힌 세상

 

4949번: 균형잡힌 세상

문제 세계는 균형이 잘 잡혀있어야 한다. 양과 음, 빛과 어둠 그리고 왼쪽 괄호와 오른쪽 괄호처럼 말이다. 정민이의 임무는 어떤 문자열이 주어졌을 때, 괄호들의 균형이 잘 맞춰져 있는지 판단

www.acmicpc.net

풀이

 

정규식을 활용하면 시간도 덜 들고 풀기 쉽지 않을까 싶어서 정규식을 활용했다.

replaceAll에 들어가는 부분인 "[^[]()]" 이 부분은 [   ] 안에 있는 문자들에 대해서 검사를 한다.

[  ] 안에 ^가 들어가 있다면 해당 문자를 제외한 모든 글자를 의미한다.

따라서, [ ^  [  ]  (  ) ] ( 보기 좋기 위한 띄어쓰기는 양해 부탁드립니다..)는 괄호로 여닫는 문자가 아닌 문자들을 의미한다.

 

replaceAll을 수행하고 나면 띄어쓰기가 제거된 괄호만 남게 된다.

 

So when I die (the [first] I will see in (heaven) is a score list). => ([]())

([ (([( [ ] ) ( ) (( ))] )) ]). => ([(([([])()(())]))])

   . => 빈 문자열

 

남은 문자열을 가지고 스택에 넣으면서, 올바르게 괄호가 열리고 닫혔는지 검증하기만하면 쉬운 문제였다.

 

Stack을 사용해서 속도나 메모리가 좋지는 않지만, 문제를 푸는데는 큰 문제가 없어서 다시 풀지는 않았다.

 

코드

 

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

public class BalncedString_4949 {
    final static String YES = "yes", NO = "no", END = ".";
    final static char[] openBracket = {'[','('}, closeBracket = {']',')'};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String inputStr ="";

        while(!(inputStr = br.readLine()).equals(END)) {
            inputStr = inputStr.replaceAll("[^\\[\\]\\(\\)]","");
            Stack<Character> bracket = new Stack<>();

            loop:
            for(int i=0; i<inputStr.length(); i++) {
                char ch = inputStr.charAt(i);
                if(ch == openBracket[0] || ch == openBracket[1]) {  // open
                    bracket.push(ch);
                } else if(ch == closeBracket[0]) { // ]
                    if(bracket.empty()) {
                        bracket.push(openBracket[0]);
                        break loop;
                    } else if(bracket.peek() == openBracket[0]){
                        bracket.pop();
                    } else {   // (가 먼저 나옴
                        break loop;
                    }
                } else {    // )
                    if(bracket.empty()) {
                        bracket.push(openBracket[1]);
                        break loop;
                    } else if(bracket.peek() == openBracket[1]){
                        bracket.pop();
                    } else {   // [가 먼저 나옴
                        break loop;
                    }
                }
            }
            if(bracket.size() ==0) {
                System.out.println(YES);
            } else {
                System.out.println(NO);
            }
        }
    }
}
반응형