ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BOJ) 균형잡힌 세상
    알고리즘/백준 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);
                }
            }
        }
    }
    반응형

    '알고리즘 > 백준' 카테고리의 다른 글

    BOJ) 카드  (0) 2020.06.24
    BOJ) 랜선 자르기  (0) 2020.06.24
    BOJ) 단어 정렬  (0) 2020.06.23
    BOJ) 케이크 자르기  (0) 2020.06.23
    BOJ) 수 이어 쓰기 2  (3) 2020.06.23

    댓글

Designed by Tistory.