코딩테스트/BOJ

[BOJ] 4949 균형잡힌 세상 - JAVA

5월._. 2022. 2. 5.
728x90

1. 풀이

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

public class BOJ_4949_균형잡힌세상 {
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

        Stack<Character> stack;
        StringBuilder sb = new StringBuilder();
        while (true) {
            String line = in.readLine();
            if (line.equals(".")) break;

            stack = new Stack<>();

            for (int i = 0; i < line.length(); i++) {
                char ch = line.charAt(i);
                
                if (ch != '(' && ch != '[' && ch != ')' && ch != ']') continue;

                if (ch == '(' || ch == '[') stack.push(ch);
                else if (stack.empty()) {
                    stack.push('*');    //체크위해서 넣어둠
                    break;
                } else if (ch == ')' && stack.peek() == '(') stack.pop();
                else if (ch == ']' && stack.peek() == '[') stack.pop();
                else break;
            }

            if (stack.empty()) sb.append("yes\n");
            else sb.append("no\n");
        }

        System.out.print(sb);
    }
}

정상적으로 반복문을 진행하는 경우는 세 가지다.

1. '(' 이거나 '['일 때 : push한다.

2. ')'이면서 가장 최근에 저장된 요소가 '('일 때 : pop한다.

3. ']'이면서 가장 최근에 저장된 요소가 '['일 때 : pop한다.

이 경우 외에는 모두 균형잡히지 않은 문자열이므로 반복문을 종료한다.

 

stack.empty()인 경우를 먼저 제거하고 2,3번 경우를 체크한 이유는 peek() 메서드는 stack이 비어있다면 오류가 나기 때문이다.


2. 결과

2022.02.05 - [알고리즘] - [BOJ] 9012 괄호 - JAVA 이 문제와 비슷해서 쉽게 풀 수 있었다.

'코딩테스트 > BOJ' 카테고리의 다른 글

[BOJ] 17298 오큰수 - JAVA  (0) 2022.02.05
[BOJ] 1874 스택수열 - JAVA  (0) 2022.02.05
[BOJ] 9012 괄호 - JAVA  (0) 2022.02.05
[BOJ] 10772 제로 - JAVA  (0) 2022.02.05
[BOJ] 10828 스택 - JAVA  (0) 2022.02.05

댓글